1

我正在尝试通过将复杂的数据库任务发送到 RabbitMQ 队列以供工作人员测功机处理来简化我的应用程序以减少服务器负载。

对于INSERTs 和UPDATEs,这相对简单。但是,我有几个密集SELECT的 s 要发送到队列中。然而,我遇到的问题是如何在用户浏览器准备好时返回响应。

我知道我应该将响应发送到第二个队列,并在客户端的浏览器中创建一个消费者。但是,我在执行此操作时遇到了一些实际问题,例如如何从队列中选择正确的响应,而不是简单地选择下一个响应(例如,如果两个人同时在页面上)。

有没有人有任何经验或建议?

谢谢

4

2 回答 2

2

RabbitMQ 站点有一个关于构建请求-响应“RPC”流的教程,这听起来就像你所追求的那样。

正如您所说,单个“响应”队列是行不通的,因为您无法选择从队列中取出哪些项目,而是按顺序排列它们。相反,诀窍是为每个客户端创建一个单独的响应队列(或者,对于最简单的实现,为每个请求创建一个响应队列)。

您可以通过声明一个“匿名”队列来做到这一点,该队列并不是真正的匿名,它的名称由 RabbitMQ 为您选择。然后,您可以将该名称作为请求的一部分发送(通常在reply_toAMQP 消息的标头中),以便另一端的工作人员知道将响应发送到哪里。在 php-amqplib 中,看起来像这样:

list($reply_queue_name, ,) = $channel->queue_declare("", false, false, true, false);

笔记:

  • queue_declare调用返回一个包含队列名称和状态的数组;list()我们只想要名称,所以我们用一个构造丢弃数组的其余部分。
  • 队列名称作为空字符串传入,告诉服务器创建一个它选择的名称。
  • 第4个参数设置为true声明队列“独占”;这意味着一旦此连接结束,队列将被清理。
于 2018-11-08T09:47:22.553 回答
0

最后,我使用了与@IMSoP 描述的不同的方法;我很想听听关于哪个更有效或被认为是更好的做法的任何意见。

在排队任务结束时,将 JSON 响应推送到 Redis 存储(键是唯一的用户 ID,值是 JSON 响应)。在浏览器中,AJAX 用于每两秒运行一个 PHP 文件,该文件检查 Redis 存储是否有与用户 ID 匹配的密钥。一旦找到,它会将值返回给浏览器,然后删除 Redis 上的 key=>value 对。

于 2018-11-09T16:22:33.010 回答