2011-03-01 2 views
0

하나의 데이터베이스가 여러 프론트 엔드 (서버 당 하나의 프론트 엔드)와 간단한 기록을 유지한다고 가정 할 때, 시간을 다루는 일반적인 해결책이 무엇인지 궁금합니다. 여러 대의 서버를 보유하고있는 즉시 전 세계적으로 일관성있는 시계를 사용할 수 없으며 요청간에 일종의 주문을 유지할 수있는 가능한 솔루션에 관심이있었습니다.하나의 데이터베이스, 다중 프론트 엔드, 유지 보수 요청 순서

구체적인 예를 들어, 고객의 기록을 기록하려고합니다. 여기서 기록은 시간 순서가 지정된 레코드 집합으로 정의됩니다. 레코드 테이블은 (customer_id, time, data)처럼 간단 할 수 있으며 history는 customer_id ==가 요청한 모든 행이 될 수 있습니다. 사용자가 보낸 각 요청에는 한 고객에게 보낸 하나의 레코드가 포함됩니다. 이상적으로, 시간은 요청이 고객에 의해 프런트 엔드로 전송 된 "실제"시간을 참조해야합니다 (사용자 POV에서 본 시간 임). 정확히 말하자면 절대 시간이 아니라 각 고객의 레코드 간 순서를 유지하는 데 신경을 쓴다.

벡터 시계 등의 솔루션을 알고 있습니다.하지만 다소 복잡한 것처럼 보입니다.이 문제는 다소 일반적인 문제 일 것으로 예상됩니까? 내 경우에는 허용되지 않습니다

솔루션 : 프런트 엔드에 도달하는 요청을 변경

  • : 나는 불행히도로 요청이 전달되는 제약 조건에서 작동해야합니다. 내가 프런트 엔드와 데이터베이스 사이에 필요한 통신 프로토콜을 완벽하게 제어 할 수 있습니다. 그래서 질문이 빨간색 청 같은 비트 사운드있다 :
  • 서버 시간 클럭

[EDIT] 같은 프런트 엔드 서버에 의해 처리되는 상호 정렬되는 필요한 모든 요청을 동기화 여기에 대한 나의 근거가 있습니다. 지금 당장이 문제가 아니지만, Google App Engine과 같은 플랫폼에 갈 가능성에 관심이 있습니다. Google App Engine은 서버가 시간 동기화되는 것을 보장하지 않는다고 명시 적으로 말합니다. 요청 순서에 대한 그 문제에 대한 해결책은 분명하지 않습니다.하지만 벡터 시계와 같은 것이 실제로 유일한 "좋은"해결책입니까?

+0

now() 함수를 사용하여 데이터베이스 서버에서 시간을 생성 할 때 발생하는 문제 – Zimbabao

+0

아마 설명이 명확하지 않지만 프런트 엔드에 표시되는 순서를 유지하려고하므로 순서와 다를 수 있습니다. 그들은 데이터베이스에 도착합니다. (h1은 프런트 엔드 1에 도착하고, h2는 프런트 엔드 2에 나중에 도착하지만 프런트 엔드 1은 h1에 대해 수행하기 전에 프런트 엔드 2가 h2에 대한 데이터베이스를 업데이트합니다. –

답변

0

가 최대한 빨리 여러 서버를 가지고, 내가 글로벌 일관 시계

음을 가정 할 수 없다, 당신은 시간 서버에 자신의 시계를 동기화하도록 서버를 구성 할 수 있습니다. 또한 데이터베이스 서버를 구성하여 시간 서버에 동기화하고 필요할 때마다 데이터베이스 서버에 동기화되도록 다른 서버를 구성 할 수 있습니다. (모든 서버에 액세스 할 수 있다면 좋은 생각이라고 말하는 것이 아닙니다. 모든 서버에 액세스 할 수 있다면 가능합니다.)

어쨌든. . . 프론트 엔드는 요청이 도착했을 때 실제로 알고있는 소프트웨어의 유일한 부분입니다. 그게 맞습니까?

맞다면 UTC로 고객의 요청 시간을 기록한 다음 데이터베이스에 타임 스탬프를 전달하는 것이 프런트 엔드 작업입니다.

서버의 시계를 동기화 할 수 없다면 모든 프런트 엔드에서 특정 서버 (어쩌면 데이터베이스 서버 일 수도 있지만 어쩌면 아닙니다)를 묻는 것이 유일한 희망이라고 생각합니다. 요청이 도착합니다. 프런트 엔드는 포트 13 (DAYTIME 프로토콜, RFC-867)에서 주간을 요청하거나 포트 37 (TIME 프로토콜, RFC-868)에서 시간을 요청하거나 포트 123 (NTP 또는 SNTP 프로토콜, RFC-1305 및 RFC-2030).

하지만 편집을 읽은 후에는 원하는 것이 불가능하다고 생각합니다. 당신은

  • 는 프런트 엔드가 프런트 엔드가 는

을 변경할 수 없습니다 보낼 것을

  • 주문은 "true"로 재구성 에 충분한 정보를 포함하지 않는 보낼 것을 말하는 것 같다 프런트 엔드가 다른 정보를 보낼 수없는 경우 벡터 시계와 간격 트리 시계가 도움이되지 않습니다.

  • +0

    클럭을 일관되게 설정할 수 없다면 (문제가 해결 될 수있는 경우 문제가 해결 될 수 있음) 각 프런트 엔드마다 시계가 다르므로 UTC를 기록한다고해서 요청을 보내는 사람이 본 것처럼 주문을 다시 작성할 수 있다고 보장 할 수는 없습니다. Zimbabao에 대한 나의 코멘트). –

    +0

    그러면 너는 망했다고 생각한다. 위의 편집을 참조하십시오. –

    +0

    프런트 엔드가 서로 및 데이터베이스에 추가 정보를 전달할 수 없다면 분명히 아무 것도 할 수 없습니다. 프론트 엔드가 외부에서받는 것을 수정할 수는 없지만, 내가 보낸 것을 수정할 수 있습니다. 즉, 벡터 시계가 확실히 문제를 해결해야하는 상황에 처해 있습니다. –

    0

    데이터베이스에 기록 데이터를 기록하는 모든 작업을 수행 할 때 당신은 날짜 정보를 두 세트를 기록 할 수 있습니다 :

    • 레코드가 통과
    • 날짜 시간을 삽입 할 때 DB에 의해 설정된 날짜 시간 데이터를 합법적 인 메타 데이터 조각으로 간주합니다.

    전자는 필요할 때면 세계를 중앙에서 볼 수 있으며, 후자는 고객 관점에서 datetime을 재구성 할 수있게합니다.

    매우 열정적이라면 JavaScript를 사용하여 일종의 매개 변수/필드를 채워서 사용자 브라우저에서 datetime을 전달할 수도 있습니다.

    +0

    이것은 합법적 인 해결책이지만, 어떤 식 으로든 요청을 제어하지 못한다는 것을 잊어 버리고 요청 자체에 정보를 추가 할 수 없습니다. –

    +0

    그러면 "당신은 무엇을 통제 할 수 있습니까?"라는 질문이 생깁니 까? 웹 서버에서 주문 프로세스 뷰를 유지하는 것은 책임입니다. 그렇다면 현재 그렇게하지 않으면 디자인을 변경해야하는 것처럼 들립니다.제 질문은 당신에게 "적절한"장기적인 전략적 해결책이나 단기 전술 해킹을 한 적이 있습니까? –

    +0

    문제는 내가 여러 * 웹 서버를 가지고 있으며 그 서버 사이에 * 주문을 유지해야한다는 것입니다. 단일 서버 내에서의 주문은 별다른 문제가 아닙니다. 나는 실행할 수있는 솔루션과 장기적인 솔루션에 관심이 있습니다 - 곧 해결책이 필요 하겠지만, 제가 지금은 가지고 있지 않은 것들을 재 설계 할 수있는 옵션을 선택할 때도 제 선택 사항을 알고 싶습니다. –

    관련 문제