웹 서비스를 사용하는 데스크톱 기반 클라이언트의 오프라인 장애 조치를 수행하는 가장 좋은 방법은 무엇입니까?


13

일반적인 문제를 공유하는 3 개의 수신 프로젝트가 있습니다.

웹 시스템에 로직이 있어야하며 RESTful 웹 서비스를 통해 해당 시스템과 통신하는 로컬 애플리케이션 (예 : POS)이 필요합니다.

내 솔루션

내가 생각해 낸 해결책은 데스크톱 응용 프로그램 메시지 대기열 에서 서비스가 오프라인 상태, 더 정확하게는 비동기 메시지 대기열 인 동안 작업을 저장 하기 위해 구현 하는 것 입니다. 그러나 이것이 가장 쉬운 부분입니다 (최상의 솔루션 인 경우). 또한 데이터 동기화 및 충돌 해결에 관심이 있습니다.

웹 시스템은 이해 당사자의 보고서 및 모니터링에 필요하므로 웹 시스템은 웹 기반이어야하며 웹 서비스는 여러 시설에 대한 요청을 처리합니다.

데스크탑 클라이언트 (바람직하게는 씬)는 Java (특히 Netbeans) 및 Symfony2를 사용하는 웹 시스템으로 구현됩니다. 두 프로젝트는 클라이언트를위한 하드웨어 통합이 필요하므로 웹 기술 (예 : Appcelerator Titanium)을 사용하여 데스크톱 응용 프로그램을 만드는 것은 큰 고통이 될 수 있습니다.

내 질문

  1. 최소한의 노력으로 최대의 효율성을 제공하는 확장 가능한 더 나은 솔루션은 무엇입니까?

  2. 그 전에 누가이 문제를 다루었습니까? 문제를 어떻게 해결 했습니까? 어떤 교훈을 공유 할 수 있습니까?

  3. 동기화를 어떻게 처리 했습니까?

편집 : 포인트 3의 질문에 누락 된 부분이 추가되었습니다.

답변:


3

나는 당신의 질문이 자바라는 것을 알고 있지만, 이 유형의 것에 대해이 메시지 버스 스타일 아키텍처를 정말로 좋아 합니다 .

기본적으로 메시지가 전송되면 잠재적으로 두 가지 응답을받습니다. 첫 번째는 로컬 캐시에서, 두 번째는 연결되면 서버에서 제공됩니다.

이 아키텍처 (코뿔소 버스 및 nhib)를 사용자 (MQ 및 hib)에 매우 쉽게 적용 할 수 있다고 확신합니다.


예, 그런 종류의 메시지 지향 아키텍처를 정확히 찾고있었습니다. 캐시 논쟁과 링크의 마지막 문장이 저를 설득했습니다.
dukeofgaming

10

모든 것을 로컬 에서 수행하고 주기적으로 동기화하십시오 .

여기 내가 당신이라면 어떻게해야합니까 (우리가 .NET에서와 같이 Java의 동기화 프레임 워크를 알지 못합니다).

로컬 응용 프로그램에서 마지막으로 성공적으로 연결했을 때 타임 스탬프를 유지하십시오.

다시 연결하는 시간에 관계없이 해당 타임 스탬프는 새 데이터를 가져온 다음 로컬에서 생성 된 새 주문을 보내는 데 사용됩니다.

그런 다음 두 개의 타임 스탬프를 유지합니다. 하나는 주문이 작성되는시기 (로컬 또는 온라인)를 정의하고 다른 하나는 서버가이를 기록한시기를 정의합니다.

메시지 큐를 권장하지 않습니다. 과거 Navision에 연결해야하는 전자 상거래 웹 사이트에 MQ를 사용했습니다. 모든 것은 Navision 내에서 운영되었으며 주문 상태 및 제품 설명, 가격 등 모든 것을 포함하여 MQ를 통해 전자 상거래 웹 사이트로 전송 된 변경 사항입니다. 새로운 주문도 MQ를 통해 Navision으로 전송되었습니다.


흠, 푸시 모델이라는 아이디어가 마음에 들지만 컴퓨터 시간이 변경되면 데이터가 손실 될 수 있다는 문제가 있습니다. BTW, 나는 데이터베이스 디자인에서 각각의 모든 레코드 타임 스탬프를 갖는 관습을 가지고있다. MQ를 권장하지 않는 이유는 무엇입니까?
dukeofgaming

맞습니다. 시간 동기화 PC와 UTC를 사용해야하지만 현재는 적어도 표준입니다 (적어도 Windows에서는). MQ가 필요한 경우도 있지만 개발중인 애플리케이션에 비해 너무 많은 것 같습니다.

따라서 안정성의 우선 순위를 지정하려면 데스크톱 앱의 연결이 끊어져 데스크톱 앱을 일류 시민으로 취급하는 것이 더 좋다고 생각하는 것이 좋습니다. 그러나 여전히 MQ가 로컬 데이터베이스 구현을보다 쉽게 ​​대체 할 수 있습니다. 또한 서버의 모든 CRUD 작업을 암시 적으로 만드는 것이 더 나은 보안을 가지고 있다고 생각합니다. 이 두 가지 점에 대해 어떻게 생각하십니까?.
dukeofgaming

@ dukeofgaming : 제 경우에는 웹을 포함하여 모든 POS (주문 처리 시스템이 아닌 주문 처리 시스템으로 응용 프로그램을 사용할 수 있음)에서 주문을 가져올 수 있습니다. 모든 것이 전국에 배포되었습니다. 연결이 끊긴 경우 모든 데스크탑이 자율적으로 작동해야했습니다. MQ는 해당 시나리오에서도 작동하므로 반대하지 않습니다. 마스터 서버와 클라이언트간에 강력한 데이터 동기화를 구현하는 것이 더 쉽다고 생각합니다. 따라서 마스터 서버에서의 CRUD 작업은 옵션이 아닙니다.

2
+1-과거에 내가 본 방식입니다. 또한 기본 키로 uniqueidentifier (Guids)를 사용하면 작업이 매우 간단 해집니다. 그렇게하는 것은 동기화가 필요할 때 실제로 인생을 더 쉽게 만들어주는 것들 중 하나입니다.
Scott Whitlock

1

또는 원격 클라이언트를 서버에 동기화하는 작업을 수행하는 가끔 연결된 시스템 데이터베이스 구현을 살펴 봐야합니다. SQL Server는 SQL CE와 함께 이것을 가지고 있으며 Outlook 은이를 수행합니다.

이런 식으로 작은 변경 공간 데이터베이스에서 모든 변경 사항을 로컬로 수행 할 수 있으며 (PC 시계 등에 대해 걱정할 필요가 없도록 버전 관리 / 논리 타임 스탬프 등을 유지) 온라인 상태가 될 때마다 주 데이터베이스와 동기화합니다. 섬기는 사람.

시스템이 대부분 온라인 상태 일 수 없을 때 REST 솔루션을 사용하지 않을 것입니다.


분산 데이터베이스를 설명하고 있습니까? 자세히 설명 할 수 있습니까?
dukeofgaming

아니요-이것은 실제 의미에서 분산 데이터베이스가 아닙니다. 분산 DB는 일반적으로 거의 모든 것이 온라인 상태 일 것으로 예상하지만 다운 된 피어 간의 복제 논리도 여기에 적용됩니다. 복제 작업을 수행 할 수있는 기능이있는 일부 데스크톱 / 장치 데이터베이스 ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… )가 있으므로이 장치 db를 설정하기 만하면됩니다. 변경 사항을 여기에 기록하고 컴퓨터 네트워크에 연결할 때 sync를 호출하면 데이터가 주 서버로 전송됩니다.
Subu Sankara Subramanian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.