我有两个应用程序 App 1 和 App 2。两者都是 Rails 应用程序。应用程序 1 从用户那里收集数据,这些收集的数据需要同步到应用程序 2。我使用 RabbitMQ 和 Sneakers(有 5 个工作进程)进行应用程序之间的同步过程。每当 App 1 中有一些更新时,一个作业就会排队到 RabbitMQ 服务器。从那里,Sneakers 处理这些作业并将数据存储在 App 2 数据库中。
用于在两个应用程序中存储数据的架构如下。
应用程序 1
作者有很多书。
作者表:
id name
1 Kruze
2 Jiht
3 Rama
书表:
id name author_id
1 Book A 1
2 Book B 2
3 Book C 1
应用程序 2
作者表:
id name original_id books
1 Kruze 1 {'1':{'id':1, 'name':'Book A'}, '3':{'id':3, 'name':'Book C'}}
2 Rama 3 {}
3 Jiht 2 {'2':{'id':2, 'name':'Book B'}}
这里 original_id 列是 App 1 的作者记录 ID,books 列是包含作者所有书籍信息的哈希。
我在这里面临的问题是,只要多个用户同时对同一作者的书籍进行多次更新(创建或更新),就会有多个作业排队到 RabbitMQ 服务器。在 App 2 中,Sneakers 并行处理这些作业(一次 5 个作业,因为在 App 2 中运行了 5 个 Sneakers 进程)。每个运动鞋流程都需要不同的时间来提交。所以最后,App 2 中出现了错误的数据。
Enqueue Order Commit Order Process
1 1 1
2 2 2
3 5 5
4 6 1
5 4 4
6 3 3
7 7 2
8 10 5
9 9 4
10 8 3
但是当只有一个 Sneakers 进程时,就不会出现这个问题。
我的问题:有没有办法克服这个不正确的数据问题?