微服务和RabbitMQ

时间:2016-12-22 14:53:49

标签: asp.net-web-api architecture rabbitmq microservices easynetq

我是微服务的新手,对RabbitMQ / EasyNetQ有疑问。 我正在从一个微服务向另一个微服务发送消息。

每个微服务都是Web API。我正在使用CQRS,我的命令处理程序会消耗队列中的消息并执行一些业务逻辑。为了调用处理程序,它需要向API方法发出请求。

我想知道,无需显式调用API端点来命中消费消息的代码。是否有自动化的方式来执行它而无需调用API端点?

建议可以创建一个单独的解决方案,它将是一个控制台应用程序,它将执行RabbitMQ以便开始监听。创建一个while循环来读取消息,然后在每次向队列发送新消息时调用web api端点来处理业务逻辑。

我的目标是创建一个监听器或启动任务,一旦消息进入队列,它将自动从队列中提取它并继续使用命令处理程序,但不知道如何执行"自动"我描述的方式。我正在考虑使用将继续运行的Azure Webjob,它将充当消费者。
寻找一种良好的建筑方式。

正在使用的编程语言是C#

备受赞赏

3 个答案:

答案 0 :(得分:1)

托管RabbitMQ订阅者的推荐方法是使用类似topshelf库的内容编写Windows服务,并在其启动时订阅该服务内的总线事件。我们在多个项目中做到了这一点,没有任何问题。

如果您使用的是Azure,那么托管RabbitMQ订阅者的最佳位置是"工作者角色"。

答案 1 :(得分:0)

  

我正在使用CQRS,我的命令处理程序会关闭消息   队列并做一些业务逻辑。为了调用处理程序,它   将需要向API方法发出请求。

你确定这是真正的CQRS吗?当您在域逻辑中以不同方式处理查询和命令时,会发生CQRS。通过calss接收消息,这个消息叫做CommandHandler并且只是对它做出反应还不是CQRS。

  

我的目标是创建一个曾经消息的监听器或启动任务   在队列中,它会自动从队列中取出它   继续使用命令处理程序但不确定如何执行"自动"   我描述的方式。我当时正在考虑使用Azure Webjob   持续运行,它将充当消费者。寻找   这是一种很好的建筑方式。

你做得越容易越好。在尝试所有简单的解决方案之前,不要去寻找复杂的解决方案。当我实现类似的东西时,我只是使用Linux cron运行一个消息处理程序脚本池。处理程序将消息从队列中取出,处理并终止。简单。

答案 2 :(得分:0)

我认为使用CQRS模式,您将拥有事件以及相应的事件处理程序。当您使用RabbitMQ进行命令和查询之间的异步通信时,可以通过回调方法监听在RabbitMQ上的特定通道上放置的任何消息

从队列接收消息更复杂。它通过将回调函数订阅到队列来工作。每当我们收到消息时,Pika库都会调用此回调函数。