5

Đồng nghiệp của tôi và tôi đã tạo một vài chương trình kiến ​​trúc máy chủ ứng dụng khách sử dụng đồng bằng để đồng bộ hóa ứng dụng khách với máy chủ. Một vấn đề liên quan đến việc xóa các bản ghi dường như được hiển thị trên nhiều dự án. Làm cách nào một máy chủ có thể xóa bản ghi cục bộ và vẫn có đủ thông tin để tạo thông tin delta delta cho các khách hàng trong tương lai?Làm thế nào để tạo ra các vùng đồng bằng cho dữ liệu bị xóa trong kiến ​​trúc máy chủ khách hàng?

Ví dụ 1:

Một trò chơi thời gian thực sử dụng UDP client-server để đồng bộ hóa lên các đơn vị giữa trò chơi. Chỉ có các vùng đồng bằng có chứa trạng thái trò chơi đã sửa đổi và dữ liệu gói bị bỏ trước đó được truyền đi. Nếu máy chủ xóa một thực thể, nó có thể gửi một delta xóa nói với mọi khách hàng để xóa đối tượng đó. Điều này làm việc trừ khi một gói tin bị loại bỏ. Điều này là ok đối với dữ liệu trạng thái bình thường, vì máy chủ có thể xác định dữ liệu nào bị loại bỏ và truyền lại từ đó, nhưng điều này có nghĩa là máy chủ không thể xóa thực thể máy chủ cục bộ (không thực hiện xác nhận đầy đủ từ mỗi máy khách) dữ liệu sẽ tồn tại để tạo ra delta xóa từ.

Ví dụ 2:

Một khách hàng muốn đồng bộ hóa với cơ sở dữ liệu được lưu trữ trên một máy chủ. Máy chủ lưu trữ ngày sửa đổi cho mỗi bản ghi trên máy chủ. Khi máy khách yêu cầu đồng bộ, nó sẽ truyền ngày cuối cùng mà nó cập nhật. Máy chủ thu thập tất cả các bản ghi đã được sửa đổi kể từ ngày đó và gửi chúng xuống máy khách. Điều này chỉ làm việc với việc xóa nếu máy chủ lưu giữ mọi bản ghi đã từng bị xóa và sử dụng một lá cờ để biểu thị việc xóa. Máy chủ không thể xóa an toàn bản ghi được lưu cục bộ.

Trong cả hai ví dụ, giải pháp duy nhất tôi có thể nghĩ là giữ một số loại bản ghi chứa mọi thứ đã từng bị xóa hoặc buộc toàn bộ đồng bộ sau một ngày/giờ nhất định. Đây không phải là mô hình bền vững hay duyên dáng. Một số phương pháp bền vững để giải quyết loại vấn đề này là gì?

Trả lời

1

Tại sao điều đó dường như không bền vững? Rất nhiều khuôn khổ đồng bộ sử dụng nó và nó được gọi là Tombstoning, afaik. Hồ sơ bị xóa hoặc bị gắn cờ là đã bị xóa và trong một bảng khác (nếu nó liên quan đến cơ sở dữ liệu), một tham chiếu đến mục đã xóa được giữ lại. Bằng cách đó, các hệ thống có thể đồng bộ các bản ghi bị xóa. Trong thực tế, nó không chỉ là về xóa dữ liệu. Một số người có thể nói rằng mọi bản cập nhật của bản ghi cũng sẽ bị xóa. Bởi vì phiên bản cũ của bản ghi không bao giờ có thể được tìm thấy một lần nữa. Vì vậy, thay vì gửi các bản cập nhật cho kho dữ liệu, chỉ gửi chèn, nếu giữ dữ liệu 'cũ' xung quanh là quan trọng.

Trong trường hợp mất UDP và mất gói, bạn sẽ phải thiết kế phần mềm của mình xung quanh nó. Nếu trò chơi gửi dữ liệu cho một số thực thể đã bị xóa, chỉ cần bỏ qua hoặc trả lời đúng đối tượng đó. Vì vậy, nhiều tùy chọn ở đây.

Bạn cũng có thể xem tìm kiếm sự kiện. Nó không phải là grale thánh hay bất cứ điều gì, nhưng nó hoạt động khác với CRUD thường xuyên. Thay vào đó, nó sử dụng CQRS để tách biệt lệnh và truy vấn bên và sự kiện tìm nguồn cung ứng được sử dụng để tạo ra một dòng các sự kiện. Bạn chỉ lưu trữ các sự kiện. Vì vậy, bất cứ khi nào bạn muốn nêu một số thực thể, bạn đọc lại tất cả các sự kiện. Nó có lẽ luôn luôn bắt đầu với một chèn, không hoặc nhiều cập nhật và sau đó một số tuyên bố xóa. Bạn sẽ có mọi thứ trong đó mà bạn cần biết. Những sự kiện này cũng được gửi đến các thành phần khác, những người tạo ra các mô hình đọc của trạng thái mới nhất. Bằng cách đó, một số giao diện người dùng có thể đọc từ mô hình đã đọc và nhanh chóng phát triển, nhưng mọi thay đổi trạng thái đều đi qua luồng sự kiện, xử lý logic nghiệp vụ cho mọi sự kiện.

Nếu bạn quan tâm đến điều này, hãy đọc về CQRS và Nguồn sự kiện từ Greg Young và rất nhiều người khác.

+0

Mức sử dụng đĩa và tăng thời gian tìm kiếm. nếu hàng ngàn khách hàng có khả năng gửi các thay đổi trên máy chủ tất cả thời gian có thể tăng lên trong một năm - và phần tồi tệ nhất là tôi không bao giờ có thể xóa nó đi. Một chiến lược mà tôi nghĩ về mô hình đó là bắt buộc cập nhật đầy đủ sau một khoảng thời gian nhất định, điều đó sẽ cho phép máy chủ xóa các bản ghi nói 3 tháng một lần, nhưng điều này dường như không phải là một mô hình duyên dáng. Trong ví dụ UDP, tôi đoán tôi có thể có một số băm được truyền đi với đối tượng để xác định xem bản ghi đang được tái sử dụng bởi một đối tượng mới hay chưa. –

+0

Chỉ cần đọc và thấy rằng Microsoft sử dụng một mô hình ngày hết hạn với việc ném đá mộ như tôi đã mô tả. –

+0

Vâng tôi đã nghĩ đến việc sử dụng mô hình loại CQRS xử lý tất cả các vùng đồng bằng, và có một chồng thay đổi phiên bản, nhưng có thể kết hợp vấn đề lưu trữ cụ thể này. Tôi sẽ phải lưu trữ toàn bộ lịch sử phiên bản cho mỗi bản ghi hoặc giới thiệu một số loại thời gian chụp nhanh. –

Các vấn đề liên quan