Đồng bộ hóa với hệ thống ngoại tuyến


9

Tôi đang thiết kế một hệ thống mà từ đó tôi sẽ đồng bộ hóa dữ liệu kinh doanh từ thiết bị di động (có ứng dụng nhúng) để tạo dữ liệu và gửi lại cho máy chủ. Mỗi dòng được đồng bộ hóa tạo ra một nhật ký kinh doanh cụ thể trong cơ sở dữ liệu.

Nếu những gì tôi đồng bộ hóa tạo dữ liệu với một ngày (trong dữ liệu đồng bộ hóa) thấp hơn ngày sửa đổi cuối cùng của dữ liệu doanh nghiệp của tôi, tôi phải bỏ qua nó và chỉ cần thêm cơ sở dữ liệu đăng nhập. Khi dữ liệu đã tải lên được xử lý, dữ liệu sẽ được tìm nạp từ cơ sở dữ liệu và được tải xuống thiết bị.

Do tải xuống này ngay sau khi viết, đồng bộ hóa phải được đồng bộ. Vẫn có thể có mẫu người đọc / người viết nếu một cái gì đó như thế này đủ giá trị để thay thế giải pháp hiện tại của tôi. Điều quan trọng hơn là có thể tải xuống dữ liệu cập nhật. Dữ liệu đó được tìm nạp toàn bộ, hiện tại không có khác biệt nào được thực hiện (nó có thể đến sau nhưng điều đó sẽ không thành vấn đề).

Tôi có thể có nhiều đồng bộ hóa trên cùng một đối tượng kinh doanh đang chạy, điều đó không thể xảy ra nhưng có thể xảy ra và tôi thích có thể xử lý nó. Việc đồng bộ hóa dự kiến ​​sẽ kéo dài trong vài giây nhưng không phải vài phút, trừ khi sử dụng ứng dụng di động nhúng mà không đồng bộ lại trong một số ngày.

Khối lượng dữ liệu được đồng bộ hóa dự kiến ​​sẽ không lớn, cả quá trình đồng bộ hóa.

Vì vậy, cuối cùng tôi sử dụng loại trừ lẫn nhau trên phương thức đồng bộ hóa của mình, chính xác hơn là tôi đang sử dụng Java và tôi đã đặt đồng bộ hóa vào phương thức viết chứ không phải toàn bộ quá trình đồng bộ hóa để không chặn đồng bộ hóa chỉ đọc.

Tôi muốn biết :

  1. Nếu cách này có ý nghĩa? Miễn là khối lượng và thời gian của quá trình đồng bộ hóa vẫn được chấp nhận.
  2. Nói một cách tổng quát, tôi nên xem xét những khái niệm nào. Phần thưởng: nếu có bất kỳ triển khai các khái niệm này trong mô-đun Spring.

Điều gì gây ra ngoại tuyến? Ý tôi là khi thiết bị ngoại tuyến, điều đó có nghĩa là không có quyền truy cập chỉ vào máy chủ hoặc nó cũng không truy cập Internet?
Laiv

Nó không truy cập được internet. Hoặc không thường xuyên.
Walfrat

Nếu bạn có nhiều máy khách / máy chủ đồng bộ hóa, trước tiên bạn phải quyết định quyền làm chủ dữ liệu trong trường hợp có gì đó khác nhau. Nếu bạn chỉ xem xét các kết nối không liên tục và nhiều khách hàng, chắc chắn không có cách nào để thực hiện việc này tăng dần.
tofro

Làm chủ dữ liệu @tofro rất dễ xác định trong trường hợp của tôi vì vậy nó không phải là vấn đề. Tuy nhiên, tại sao không thể làm điều đó tăng dần với các kết nối không liên tục? Tôi có nên sử dụng ngày đồng bộ hóa cuối cùng không? Vấn đề duy nhất trong trường hợp của tôi khi sử dụng một ngày như vậy là làm thế nào để biết rằng dữ liệu hiện có trên thiết bị của tôi đã bị di chuyển và nên bị xóa trên thiết bị.
Walfrat

Từ mô tả của bạn, tôi đã hiểu rằng cùng một mục dữ liệu có thể được thay đổi trên máy chủ hoặc trên một hoặc nhiều máy khách. Làm thế nào bạn có thể đồng bộ ba chiều một mục dữ liệu đã đi tới thiết bị di động số 1, sau đó được thay đổi trên máy chủ, sau đó chuyển sang thiết bị di động số 2 và được thay đổi ở đó, sau đó kết nối di động số 1 (với thiết bị di động bị ngắt kết nối số 2)?
tofro

Câu trả lời:


1

Một cách tiếp cận mà tôi đã và đang nghiên cứu cho một lúc bây giờ (với một số thành công) để có dữ liệu khách hàng đồng bộ với dữ liệu máy chủ, mà không dựa vào số ngày (có thể không đáng tin cậy) hoặc yêu cầu đồng bộ, là sự kết hợp của JSON Patches (có lẽ POJO s trong trường hợp của bạn) và tìm nguồn cung ứng sự kiện .

Ý tưởng cơ bản là thay vì lưu trữ trạng thái hiện tại trên máy khách và máy chủ, máy khách và máy chủ lưu trữ một danh sách các thay đổi và nhắn tin cho nhau thông qua các sự kiện hoặc yêu cầu vá lỗi.

Vì vậy, thay vì yêu cầu khách hàng gửi tất cả dữ liệu cộng với ngày đến máy chủ, khách hàng sẽ gửi một sự kiện, cùng với số sửa đổi tương ứng với lần cuối cùng khách hàng nghĩ rằng dữ liệu đã được cập nhật. Một cái gì đó như thế này:

Server.send("MODIFY FOO", 3);

Khi máy chủ nhận được sự kiện này (không đồng bộ), nó sẽ điều hòa nó với các sự kiện khác mà nó có thể đã nhận được. Ví dụ: có thể một khách hàng khác làm việc với cùng một dữ liệu có thể đã sửa đổi một số thứ và bây giờ số sửa đổi trên máy chủ là 5. Do đó, sửa đổi này sẽ cần phải được áp dụng trước khi 2 lần cuối được áp dụng, và tất cả khách hàng sẽ cần được thông báo về sự thay đổi này.

Khi máy chủ kết thúc, nó sẽ thông báo cho tất cả các khách hàng quan tâm về các thay đổi đã được thực hiện và số sửa đổi hiện tại mới. Sau đó, khách hàng áp dụng những thay đổi này và cập nhật số sửa đổi nội bộ của mình.

Số dặm của bạn có thể thay đổi, nhưng tôi hy vọng điều đó có ích.

Chỉnh sửa: Một tên khác cho phương pháp này, hoặc một biến thể của nó, được gọi là hàng đợi tin nhắn , như được đề cập trong câu hỏi liên quan này .


Hệ thống có thể ngoại tuyến (không có quyền truy cập vào máy chủ) trong một số ngày và phải đăng ký ngày khi sự kiện xảy ra, không phải khi sự kiện được đồng bộ hóa với máy chủ. Đó là lý do tại sao tôi phải sử dụng ngày. Tôi cũng có số sửa đổi để lạc quan, nhưng vì lý do tương tự, 2 thiết bị có thể tải xuống phiên bản X của POJO và khi chúng đồng bộ hóa sau mỗi sự kiện gửi phải tạo phiên bản X + 1 và X + 2. Và các thiết bị không thể giao tiếp với nhau.
Walfrat

Số sửa đổi trong câu trả lời này luôn được tạo trong máy chủ, khách hàng gửi số sửa đổi cũ, không cần biết về các khách hàng khác vì việc tăng sửa đổi không phải là trách nhiệm của họ. Câu trả lời này không đề cập đến giải quyết xung đột, đó là phần quan trọng nhất của giải pháp được đề xuất.
Basilevs

0

Vấn đề đầu tiên là sử dụng ngày tháng như một cách để đồng bộ hóa dữ liệu. Tôi thực sự chắc chắn rằng tôi đã không nhận được tất cả các chi tiết về giải pháp của bạn nhưng tôi sẽ nói rằng:

  1. Là những ngày được tạo ra trên điện thoại di động? Trong trường hợp này, bạn có chắc chắn ứng dụng chạy trên điện thoại di động sẽ luôn sử dụng đúng ngày không? Điều gì về một người dùng độc hại mà phần nào có thể thay đổi ngày hệ thống trên thiết bị di động của anh ấy / cô ấy? Còn người dùng trong các múi giờ khác nhau thì sao? Như @jeffrey đã nói với bạn, có lẽ đó không phải là cách tiếp cận tốt nhất để dựa vào ngày được tạo trên thiết bị.

  2. Nếu tôi hiểu đúng, bạn sử dụng Điều khiển đồng thời lạc quan . Tôi không thấy bất cứ điều gì sai trái trong cách tiếp cận của bạn.

  3. Câu hỏi này là về việc thực hiện Khóa lạc quan vào mùa xuân . Có lẽ bạn có thể tìm thấy một số cảm hứng trong đó.


Tôi cần ghi lại ngày mà hành động được thực thi, vì như vậy tôi bị kẹt với ngày của điện thoại di động. Ngày di động thường được đồng bộ hóa lại với hệ thống. Chỉ đăng ký lệch lạc mới có thể đồng bộ hóa với máy chủ. Về bảo mật, hiện tại vẫn còn một mối lo ngại khác (xác thực thiết bị X509, ...)
Walfrat

Ngày có thể được ghi lại dưới dạng một trường dữ liệu khác, không cần coi nó là mã thông báo đồng bộ hóa.
Basilevs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.