Otrzymujemy równoległe wywołania zwrotne do naszej aplikacji internetowej od dostawcy i podejrzewamy, że powoduje to utratę aktualizacji, ponieważ są one przetwarzane w tym samym czasie na różnych komputerach.Jak mogę przetwarzać większość zadań równolegle, ale serializować podzbiór?
Musimy serializować przetwarzanie tych wywołań wtedy i tylko wtedy, gdy mają one wpływ na ten sam rekord użytkownika.
Mój kolega zaproponował strumień AWS Kinesis, w którym używamy ID użytkownika jako klucza partycji. Chodzi o to, że ten sam klucz partycji umieszcza rekord w tym samym fragmencie. Każdy fragment jest przetwarzany przez tylko jednego pracownika i nie będzie problemów z współbieżnością. Z założenia zagwarantujemy, że rekordy należące do tego samego użytkownika nie będą przetwarzane równolegle. To rozwiązanie skaluje i rozwiązuje problem, ale przywróci nam przynajmniej sprint.
Staramy się znaleźć rozwiązanie, które możemy wdrożyć szybciej.
Inne rozwiązania Omówiliśmy dotąd:
- Wystarczy opóźnić przetwarzanie wywołań zwrotnych, potencjalnie przez losową ilość czasu. W tym scenariuszu nadal jest (choć mniej prawdopodobne), że kilku pracowników przetwarza zadania dla tego samego użytkownika w tym samym czasie.
- Dowolny system kolejkowania ma wadę, że jesteśmy albo ograniczeni do jednego pracownika, albo do przetwarzania równoległego ryzyka, albo takiego samego, jak opisano w (1).
Jesteśmy na stosie Rails z MySQL i preferujemy AWS dla naszych rozwiązań.
Czy istnieje rozwiązanie tego problemu, które przyniesie szybsze wyniki niż przejście na Kinesis?