9

Chúng tôi nhận được các cuộc gọi lại đồng thời với ứng dụng web của chúng tôi từ một nhà cung cấp và chúng tôi nghi ngờ nó khiến chúng tôi bị mất cập nhật vì chúng được xử lý cùng lúc trên các máy khác nhau.Làm thế nào tôi có thể xử lý hầu hết các công việc song song nhưng tuần tự hóa một tập con?

Chúng tôi cần phải tuần tự hóa quá trình xử lý các cuộc gọi đó nếu và chỉ khi chúng ảnh hưởng đến cùng một bản ghi người dùng.

Một đồng nghiệp của tôi đã đề xuất luồng AWS Kinesis nơi chúng tôi sử dụng ID người dùng làm khóa phân vùng. Ý tưởng là cùng một khóa phân vùng đặt bản ghi trong cùng một phân đoạn. Mỗi phân đoạn được xử lý bởi chỉ một công nhân duy nhất, và sẽ không có vấn đề tương tranh. Theo thiết kế, nó sẽ được đảm bảo rằng các bản ghi thuộc về cùng một người dùng không được xử lý song song. Giải pháp này quy mô và giải quyết vấn đề nhưng nó sẽ đặt chúng ta trở lại ít nhất là chạy nước rút.

Chúng tôi đang cố gắng tìm một giải pháp mà chúng tôi có thể triển khai nhanh hơn.

giải pháp

khác, chúng tôi đã thảo luận cho đến nay:

  1. Đơn giản chỉ cần trì hoãn việc xử lý các callbacks, có khả năng một lượng thời gian ngẫu nhiên. Trong trường hợp này, vẫn có thể (mặc dù ít có khả năng hơn) đối với một số công nhân để xử lý công việc cho cùng một người dùng cùng một lúc.
  2. Bất kỳ hệ thống xếp hàng nào đều có lỗi mà chúng tôi bị hạn chế đối với một công nhân hoặc xử lý song song rủi ro hoặc giống như được nêu trong (1).

Chúng tôi đang ở trên ngăn xếp Rails với MySQL và thích AWS cho các giải pháp của chúng tôi.

Có giải pháp cho vấn đề này sẽ mang lại kết quả nhanh hơn chuyển sang Kinesis không?

Trả lời

0

Bạn về cơ bản đang tìm kiếm các khóa phân phối có tên, để bạn có thể thực thi xử lý nối tiếp.

Nếu bạn đang ở AWS, bạn có thể đẩy một bản ghi tới DynamoDB với từng customerId.

Mỗi lần bạn nhận hồ sơ để xử lý, hãy đọc nhất quán (xem phần đồng thời tại đây: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html).

Nếu có bản ghi, hãy thêm tin nhắn của bạn vào đó (ghi nhất quán). Có quá trình được xử lý làm một đọc sau khi nó được thực hiện, và nếu có tin nhắn nối vào hồ sơ dynamo, xử lý chúng serially. Cuối cùng xóa bản ghi.

Có thể bạn sẽ nhận được điều kiện chủng tộc, vì vậy bạn sẽ cần phải thực hiện việc lùi lại và thử lại. Tôi không biết khối lượng của bạn là gì, nhưng Dynamo thì khá nhanh, nên tỷ lệ đánh trúng này nhiều hơn một vài lần là rất mỏng. Nếu nó thất bại quá nhiều lần, bạn có thể phải đổ mọi thứ vào hàng đợi lỗi để dọn dẹp, nhưng nó không chắc lắm. Đặc biệt là nếu khối lượng của bạn cho phép bạn xem xét các giải pháp như sự chậm trễ tùy ý trong xử lý tin nhắn.

0

Chỉ có một số đầu vào lý thuyết:

Nếu bạn có callbacks độc lập về mặt kỹ thuật bạn cần một định ngữ nghĩa đánh dấu chúng như phụ thuộc hoặc độc lập và một id chuỗi để đảm bảo trật tự thực hiện. ID người dùng không đủ. Làm thế nào bạn có thể đảm bảo thứ tự thực thi cơ sở dữ liệu thích hợp của các yêu cầu web song song của một người dùng?

Nếu bạn có id giao dịch duy nhất, bạn có thể áp dụng các mức cách ly như tuần tự hóa. Nhưng trong trường hợp này bạn không phải là bất khả chiến bại chống lại "của bạn" bị mất cập nhật hoặc. Chúng cũng sẽ xảy ra khi bạn sử dụng tuần tự hóa trừ khi bạn không có số thứ tự (phiên bản) và cơ chế khóa.

Đảm bảo bạn nói về "ghi đè dữ liệu không được cam kết" nếu bạn muốn nói "mất cập nhật" để tránh thiếu sót. Điều này sẽ được xử lý với ít nhất mức cô lập "đọc lặp lại".

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