2017-10-23 13 views
0

저희 회사에서 판매하는 시스템은 다중 기계 솔루션 용 소프트웨어입니다. 경우에 따라 시스템 중 하나에는 UI가 있고 다른 시스템에는 백엔드/API가 있습니다. 이러한 시스템은 다양한 작동 및 저장 값을 위해 자체 시계를 사용하고 통신합니다.한 컴퓨터의 웹 서버 UI가 다른 서버의 백엔드/API와 동기화되지 않게하려면 어떻게해야합니까?

UI의 시스템 시계가 백엔드보다 30 초 이상 앞서면 UI의 타임 스탬프가 주요 정보로 REST 요청으로 보내지기 때문에 쿼리가 잘못 수행되기 시작합니다. 30 초마다 발생하는 "나에 의해 업데이트 된 것"쿼리가 있으며, 데시크는 업데이트 된 데이터가 타이밍 창 외부에 있기 때문에 누락 될 수 있습니다.

내 소프트웨어가 설치된 시스템을 제어 할 수 없기 때문에 코드면에서 해결책이 필요합니다. 고객이 시계를 동기화하도록 강요 할 수는 없습니다.

가능한 솔루션은 나는 생각했다 :

  • UI는이 시스템 시간에 대한 백엔드를 조회하고 캐시 할 수 있습니다.
  • 백엔드/API는 업데이트를 찾을 때 더 늦게 도달 할 수 있습니다. 이렇게하면 시계가 잠글 수있는 공간이 생기지 만 대량의 데이터가있는 시스템에서는 훨씬 더 무거운 쿼리로드가 발생합니다.

아이디어가 있으십니까?

+0

....이 영역에서 많은 시간을 소비하지 않고 로그인 (또는 이와 동등한) 시간에 서버 시간을 캐시해야하지만 더 큰 질문은 "매 30 초마다?"입니다. 자동 저장 장치와 같은 작업을 수행하는 경우 "30 초 또는 처음으로 변경 사항이 발생합니다. 둘 중 빠른 날짜가됩니다."가되어야합니다. 그러나 일반적으로 말하자면 UI 클록을 무의미하게 만들려고 시도해야합니다 ("클라이언트를 신뢰하지 마십시오"의 일부 - _future_ 타임 스탬프가 제공되면 어떻게됩니까?). 그렇지 않으면이 시스템이 어떻게 상호 작용하는지에 대해 더 자세한 정보가 필요하다고 생각합니다. –

+0

@ Clockwork-Muse - 나는이 분야에서 매우 새로운 사람이지만, 클라이언트가 변경 한 사항은 "이 항목의 소유자 변경"또는 "상태 변경"과 같은 이벤트입니다.자동 저장 안함. 웹 UI는 1-50 명이 동시에 사용하도록 설계되었으므로 30 초간의 업데이트가 중요한 이유입니다. 그러나 30 초는 경주 조건을 보호하지 않을 것입니다 ... 그것은 현재 상태에서 "동기를 유지하기 위해 최선을 다하겠습니다"접근 방식입니다. – Shadoninja

+0

사실 내가 주변을 둘러보고 사람들에게 더 이야기하면 NTP 서버로 구성된 기계 네트워크가 모든 sysadmin에 의해 예상되는 것처럼 보입니다. 나는이 주제에 대한 나의 걱정이 조금 과장된 것이라고 생각한다. 나는 사람들이 무엇을 말해야하는지보기 위해 하루나 이틀 동안 질문을 떠날 것이고, 나는 그것을 닫을 것이다. – Shadoninja

답변

1

가장 좋은 방법은 API를 다소 재구성하는 것입니다.

먼저 NTP를 사용하는 것이 좋지만 실제로는 사용을 보장 할 수 없습니다. 또한이 기능이 활성화되어 있어도 OS (Windows 이상)는 특정 공격 (분 단위로 방지)을 방지하기 위해 너무 자주 동기화되지 않은 패킷을 거부 할 수 있습니다.

이와 같은 분산 서비스를 처리 할 때, "클라이언트를 신뢰하지 마십시오"라는 말입니다. 이는 실제로 클라이언트를 제어 할 때도 적용되며 클라이언트가 악의적 인 시도를한다는 것을 의미하지는 않습니다. 이는 클라이언트가 신뢰할 수있는 출처가 아님을 의미합니다.
타임 스탬프가 포함되어야합니다.
고려하십시오. 타임 스탬프는 클라이언트의 시간을 사용하여 서버를 쿼리하려고하기 때문에 여기에서 문제가됩니다. 단, 클라이언트를 신뢰해서는 안됩니다. 대신 서버가 요청이 처리 된 시간 스탬프 또는 데이터베이스의 최신 항목에 대한 업데이트 스탬프를 반환하여 이후의 쿼리에서 새 업데이트를 검색하는 데 사용할 수 있습니다 (얼마나 오래 전에 다시 돌아가는지). 초기 쿼리는 귀하에게 달려 있습니다).

동시 업데이트를 안전하게 처리하는 것은 조금 더 힘들며 충돌시 발생해야하는 상황에 따라 달라집니다. 여기에는 문제의 데이터베이스 중심 버전을 다루는 대부분의 질문과 답변과는 다른 점이 있습니다. 상황을 올바르게 처리하거나 감지하기 위해 API에 추가 필드를 추가해야 할 수도 있음을 언급하고 있습니다. 아직.

+0

요청이 처리되었을 때 호출자에게 API를 알려주는 접근 방식을 좋아합니다. 이것은 이미 만들어진 통화에 시간 동기화를 통합합니다. 난 그냥 요청 처리 시간을 캐시하고 각 후속 요청에 대해 그것을 사용 (그리고 업데이트) 할 수 있습니다. 내가이 일을 한 후에 다시보고 할 것이다. – Shadoninja