如何使用RabbitMq进行异步RPC调用

时间:2017-02-16 11:59:05

标签: c# asp.net rabbitmq .net-core

我试图通过RabbitMq做一个调用后端(C#)的RestApi(asp.net核心)。要处理许多请求,我需要异步调用后端。

对我来说,来自rabbitmq的示例代码似乎不是线程安全的,因为它会使消息出列,直到返回具有正确相关id的消息。所有其他人都将被忽略。 (链接:https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html

  while(true)
  {
      var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
      if(ea.BasicProperties.CorrelationId == corrId)
      {
          return Encoding.UTF8.GetString(ea.Body);
      }
  }

我正在思考以下各种可能性:

可能性1:

我可以使用SimpleRpcClient并为每个请求创建一个自己的实例。这将导致为每个请求创建一个新的回复队列。

可能性2:

创建一个自己的RPC客户端,创建一个回复队列(可能是每个请求类型),并根据相关ID返回对正确请求的正确响应。

使多个调用异步的最佳做法是什么?是否已经实现了第二种可能性,还是我需要自己实现?

1 个答案:

答案 0 :(得分:1)

  1. 设计作业队列,将作业从生成器推送到队列并忘记,以便作业生成器保持响应
  2. 让多个工作人员等于可用CPU线程数(以优化性能)来处理作业
  3. 每个工作人员从主队列中取消作业,并将结果放在新队列中。
  4. 保留功能
    1. 不处理*太旧的**工作。
    2. 终止长时间运行作业。
    3. 首先选择高优先级作业。
    4. 如果允许设计远程作业运行程序节点