我的用户正在网络上协作编辑数据。我的产品需要他们的编辑才能成为原子。我无法在数据库级别保证它,所以我希望一次只执行一次更新。
以下是我需要能够并行化多个文档的内容:
我们说我们有两份文件A和B
1)队列服务器启动为空
2)1个用户提交文档A的更新
3)队列服务器接收更新,创建QueueA并将更新放入其中
4)其他3个用户提交对在QueueA中排队的documentA的更新
5)其他2个用户提交文档B的更改,这些更改在新队列QueueB
中排队6)启动工作池。
7)Worker1发出请求,QueueA的第一条消息被传递(尽管如果它首先是QueueB中的消息则不会出现问题)。在获得响应之前,QueueA被标记为忙碌
8)另一个工人发出请求,返回QueueB中的项目。 QueueB被标记为忙碌。
9)在第三个请求中,由于两个队列都忙,所以没有返回任何内容。
10)第一个工作人员完成任务,调用经纪人,QueueA不再忙。
11)一名工人发出请求,它应该从QueueA收到消息。
12)工人B超时,释放QueueB消息。
我已经开始阅读有关Rabbit MQ,AWS SQS / SNS,Kafka ......我在该领域的知识不是很了解,但令我惊讶的是,我还没有找到符合我要求的系统在网上。 现在我不知道我的设计是否有问题,我还没有看到,如果我找不到合适的关键字或软件供我使用......可扩展性应该很容易这就是为什么我看过这些工具。
我怎样才能轻松实现这个设计?
答案 0 :(得分:0)
这是一个很难在堆栈溢出答案中准确解决的应用程序设计问题。您正在做的事情听起来像是使用队列缓冲和缩放来异步处理数据。规模部分很简单..您可以添加更多的消费者(也就是正在运行的服务流程),并且可以并行处理请求。
我认为考虑问题的最佳方法是将其分解为数据处理的各个步骤,并将队列作为开启和关闭斜坡进入其他不同的过程。更重要的是,我需要一些白板时间来遍历整个问题空间。
ActiveMQ和RabbitMQ听起来更适合这里。按下推荐一个,我倾向于使用基于Java的ActiveMQ b / c,大多数商店都知道如何监控和支持基于Java的应用程序。 SQS是有限的,并且鉴于此声音业务数据,使用HTTP作为传输不是一个强大的解决方案。卡夫卡在这里听起来并不合适。