使用RabbitMqBundle的管道和过滤器

时间:2014-08-14 12:07:01

标签: php symfony rabbitmq pipe

我正在尝试使用RabbitMqBundle创建管道和过滤器(http://www.eaipatterns.com/PipesAndFilters.html)。最终设置应如下所示:

[main_topic_exchange]

   |---BK=S1.K1---> consumer1.1 ---BK=S2.K1---> consumer2.1---> ...
   |---BK=S1.K2---> consumer1.2 ---BK=S2.K2---> consumer2.2---> ...
                             ...............
   |---BK=S1.Kn---> consumer1.n ---BK=S2.Kn---> consumer2.n---> ...

基本上我需要能够配置管道"蓝图"并根据需要启动尽可能多的管道实例(用于可伸缩性)。

  • 每个管道或管道中的第一个消费者都绑定到交换机(例如BK = S1.k1)
  • 消息从一个计算阶段(例如BK = S2.K1)传递到下一个
  • 每个队列都是独占的
  • 必须保证通过管道的消息顺序
  • 流程将通过supervisord进行管理

我的解决方案:

  1. 使用现有捆绑包并在回调中直接指示生产者和路由键,以指示下一阶段 - 不太灵活,以硬编码

  2. 扩展rabbitmqbundle并创建具有路由密钥setter方法的使用者并从命令行传递它:

  3. ./app/console rabbitmq:pipe1_consumer1 --route=S1.K1 --next=S2.K1 ./app/console rabbitmq:pipe1_consumer2 --route=S2.K1 --next=S3.K1 ./app/console rabbitmq:pipe1_consumer2 --route=S2.K1 --next=S3.K1

    - 接下来将指示到下一个计算阶段(消费者)的路由密钥。

    我不确定什么是最优雅的解决方案,任何想法?

    感谢。

1 个答案:

答案 0 :(得分:1)

RabbitMQBundle作者在这里。该捆绑包的最初目标是实现多种消息传递模式。考虑到管道和过滤器只是另一种模式,最好的方法是实现它并将其添加到库中。我会欢迎这样的补充。