awe*_*ndt 9 architecture parallel-processing concurrency asynchronous ruby-on-rails
我们从供应商那里获得了对我们的Web应用程序的并发回调,我们怀疑它导致我们丢失更新,因为它们在不同的机器上同时处理.
当且仅当它们影响同一用户记录时,我们需要序列化这些调用的处理.
我的一位同事提出了一个AWS Kinesis流,我们使用用户ID作为分区密钥.这个想法是相同的分区键将记录放在同一个分片中.每个分片仅由一个工作程序处理,并且不会出现并发问题.通过设计,可以保证不会并行处理属于同一用户的记录.这个解决方案可以扩展并解决问题,但它至少会让我们回到冲刺阶段.
我们正试图找到一种可以更快部署的解决方案.
到目前为止我们讨论的其他解决方案
我们使用MySQL进行Rails堆栈,并且更喜欢AWS作为我们的解决方案.
有没有解决这个问题的方法,比切换到Kinesis会产生更快的结果?
小智 0
您基本上正在寻找命名的分布式锁,以便可以强制执行串行处理。
如果您在 AWS 中,您可以将带有每个 customerId 的记录推送到 DynamoDB。
每次获得要处理的记录时,请进行一致的读取(请参阅此处的并发部分: http: //docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html)。
如果存在记录,请将您的消息添加到其中(一致写入)。让正在处理的进程在完成后进行读取,如果有消息附加到发电机记录,则串行处理它们。最后删除该记录。
您可能会遇到竞争条件,因此您需要进行退避并重试。我不知道你的音量是多少,但 Dynamo 的速度相当快,所以多次达到这个值的可能性很小。如果失败次数太多,您可能必须将内容转储到错误队列中进行清理,但这不太可能。特别是如果您的容量允许您考虑诸如消息处理中的任意延迟之类的解决方案。