在一组工人中消耗几个队列,一次一个项目

时间:2016-10-06 00:13:39

标签: rabbitmq activemq apache-kafka amazon-sqs blockingqueue

我的用户正在网络上协作编辑数据。我的产品需要他们的编辑才能成为原子。我无法在数据库级别保证它,所以我希望一次只执行一次更新。

以下是我需要能够并行化多个文档的内容:

我们说我们有两份文件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 ......我在该领域的知识不是很了解,但令我惊讶的是,我还没有找到符合我要求的系统在网上。 现在我不知道我的设计是否有问题,我还没有看到,如果我找不到合适的关键字或软件供我使用......可扩展性应该很容易这就是为什么我看过这些工具。

我怎样才能轻松实现这个设计?

1 个答案:

答案 0 :(得分:0)

这是一个很难在堆栈溢出答案中准确解决的应用程序设计问题。您正在做的事情听起来像是使用队列缓冲和缩放来异步处理数据。规模部分很简单..您可以添加更多的消费者(也就是正在运行的服务流程),并且可以并行处理请求。

我认为考虑问题的最佳方法是将其分解为数据处理的各个步骤,并将队列作为开启和关闭斜坡进入其他不同的过程。更重要的是,我需要一些白板时间来遍历整个问题空间。

ActiveMQ和RabbitMQ听起来更适合这里。按下推荐一个,我倾向于使用基于Java的ActiveMQ b / c,大多数商店都知道如何监控和支持基于Java的应用程序。 SQS是有限的,并且鉴于此声音业务数据,使用HTTP作为传输不是一个强大的解决方案。卡夫卡在这里听起来并不合适。