여러개 클라이언트가 줄 하나로 통신할 때
ex) 철광석을 여러 기차역들에게 가져다달라고 요청하면 기차역들이 그 요청을 받아서 철광석을 배송하는 시스템
생기는 문제 하나가 뭐냐면
클라이언트가 똑같이 설계되었다면 한 요청에 여러 개의 클라이언트가 동시에 응답해서 충돌이 생길 수 있음
ex) 철광석 50개를 달랬는데 기차역 3개에서 전부 50개를 가져다줘서 총 150개를 받게 됨
그래서 이걸 막기 위해 클라이언트마다 유일무이한 숫자 값을 하나씩 가지는 방법이 있음
그러면 요청이 들어온 후 이 숫자 값의 틱만큼 대기하다가 다른 곳에서 안받아가면 요청을 수락하는 등의 방법으로
중복 응답을 피할 수 있음
문제는 이 유일무이한 숫자 값을 어떻게 정해주냐인데
1. 사람이 직접 정해준다 - 귀찮아서 탈락
2. 클라이언트가 설치되는 순간의 시간 또는 그 시간을 입력으로 넣은 랜덤함수의 결과값 -
이건 딱히 사람이 해야 할게 없어서 편해보이지만
만에 하나 두 클라이언트가 정확히 동시에 설치된다면 똑같은 값을 가져 오작동이 난다는 문제가 있음 (물론 극악의 확률)
그래서 오작동을 감지하는 회로를 추가적으로 만들어놓고 오작동이 나면 사람이 가서 조정해줘야함
나는 완벽한 자동 시스템을 원하므로 탈락
그래서 고민하다가 생각난 방법이 아래임
3. 전역 물류 네트워크에서 하나의 아이템을 뺑뺑이돌리면서 받아온다
일단 전역 물류 네트워크를 준비함
아래 나오는 모든 상자는 전부 이 전역 물류 네트워크에 연결되어있음
그리고 그 전역 물류 네트워크에 평생 안 들어갈 거 같은 업그레이드 계획기나 산탄총 같은 아이템을 딱 1개만 준비함
그 아이템으로 필터를 걸어 놓은 보관상자(노란상자)에 그 아이템 1개를 넣어놈
그리고 클라이언트마다 요청상자(파란상자)와 능동공급상자(보라상자)가 있음
클라이언트에는 맨 위어서 설명한 대로 고유한 값이 저장될 예정인데
이 값이 아직 저장되지 않았을 경우 요청상자에서 바로 위에서 넣어논 아이템을 1개 요청함
그리고 그 아이템이 요청상자로 들어온 걸 확인한 후에 현재 시간 또는 그것을 시드로 한 랜덤함수 결과값으로 고유한 값을 지정함
고유한 값을 지정한 후 1개 들어왔던 아이템을 능동공급상자로 넘겨서 다시 내보냄.
아까 고유한 값이 저장되었으므로 다시 아이템을 요청하지 않게 됨.
이렇게 하면 전역 물류 네트워크에 지정한 아이템이 1개밖에 없으므로 클라이언트가 동시에 고유값을 할당받는 일이 생기지 않게 됨.
이렇게 하면 별론가
어떰??
아 전에 생각했다가 까먹고 안썼는데 클라이언트에 기차를 포함해서 그 기차 ID 읽어올 수도 있었던거같은데
기차가 나은가??
클라이언트들이 가진 id중 최댓값을 중앙 시스템이 알고있다면 아무 문제 없이 id 배정을 해줄수 있음
어떤 방식으로 해줌? 자세히 설명해줄 수 있음?
근데 나도 처음엔 식별자만큼 대기시간 부여하는 방향으로 하려고 했는데 뭐가 문제라고 정확하게 말하긴 힘든데 무한루프 관련해서 찜찜한게 남아있어서 완전무작위 방향으로 하기로 함
내가 아주 오래전에 쨔봤던 회로에서는 모든 클라이언트가 각각 1씩 전역네트워크에 신호를 줘서 총 클라이언트 개수를 구하는 방식으로 했었고 근데 이 방법의 문제점은 아이디가 낮은 클라이언트가 어떤 이유로 사라지면 아이디가 꼬인다는거 두번째 방법은 시스템이 카운터를 가지고있으면 됨. 깔끔하고 안전함
기차역 하나 설치할 때마다 일정신호조합기로 광역신호에 일정값 추가. 그 값을 ID로 하면 어떰?
이제 보니깐 위에 답글이 써 놓은게 내가 쓴 거랑 똑같네... 낮은 번호의 기차역이 사라지면서 생기는 문제를 해결하고 싶으면 역이 건설될 때 딱 1틱동안만 신호를 보내고 전역네트워크에 저장회로를 걸어주는 식으로 하면 될 듯.
그리고 난수시간만큼 대기하면 문제가 있는데 예를 들어 일반적인 주기 2^32, 범위 0~2^32-1인 32비트 난수생성기를 쓴다면 기차가 출발하는데 있어서 최대 2^32-1틱만큼 기다려 줘야 하는 상황이 발생할 수 있지 않을까? 그걸 해결하려면 결국 모듈러로 일정 숫자 이상이면 짤라줘야 하는데 이러면 완전히 같은 시간에 건설된 역이 아니어도 번호가 겹칠 수 있다는 문제가 발생함. 조합론 배웠으면 알겠지만 이런 상황에서는 번호가 겹칠 확률이 급수적으로 늘어남... 무작위 40명을 모아놓으면 생일이 같은 사람이 두 명 있을 확률이 80프로 이상인 것 처럼, 10^4틱 주기로 난수를 해 놓는다 해도 몇백개 안 가서 꼬이는 상황이 벌어지게 됨....
결국 카운트를 해서 절대 겹치지 않게 하는 방식이 나음. 불확실한 요소를 굳이 프로그램에 집어넣을 이유는 없다고 생각함
걸어주는 딜레이가 서로 다르다고 연쇄적으로 요청이 겹치는일이 안터지는건 아니라는게 걱정되는것중 하나임 예를들어 0틱에 21번, 30번에서 요청하고 21틱에 9번이 요청, 30틱에 9번, 21번, 30번이 요청, 최종적으로 30번은 60틱(=1초)라는 긴 시간을 대기해야함 사실 온갖 역이 공급에 어려움을 겪는 상황을 전제했기때문에 클라간 요청의 겹침이 우려되는건데 1~40번이 전부 자기 통신요청부터 받아달라고 그러고있다면 낮은 번호의 역들이 끔찍한 결과를 만들어낼거임
근데 궁금한 게 일정신호조합기로 광역신호에 일정값을 추가하는 방식을 쓸 때 만에 하나 일정신호조합기가 동시에 설치되면 어떡함?
나라면 수동으로 id 만들던가 아니면 기차 id 긁어와서 쓸듯
아니면 클라이언트의 회로가 10초에 한번만 돌게 만들면 겹칠 확률이 1/600이니까 충분히 낮다고 봄
요청 신호 발송, 요청 응답신호 발송, 응답신호 중 최소든 최대든 랜덤이든 하나 지정해 배송명령 발송, 래치작동
ㅇㅎ ㄳ ㄳ
아니면 요청했다는 정보를 클라가 보내고, 서버에서 클라를 선정하는 방법을 써보셈.
서버측에서 전역으로 클라한테 id 대조값들을 보내고, 클라가 응답하면서 서버가 클라 하나를 지정해서 id를 매칭하는 거임 예를들어 id가 1 2 3 4가 있으면, 서버에서 요청신호를 받으면 1부터 클라에게 확인신호를 보내고, 먼저 응답하는 클라한테 요청을 수락해주는 거지
글에서 말한 3번방식을 하는 경우에는 물류보다 열차를 쓰는 것도 나쁘지 않을듯. 역에서는 열차가 지금 오고있는지도 확인할 수 있으니까, 동시에 설치되어도 열차는 한곳만 가기 때문에 고유값을 지정받을 수 있지. 게다가 이게 더 즉각적이기도 함. 역을 꺼서 오던 열차는 딴곳 가게하면 되고