通过 RabbitMQ 传递重物

Passing heavy objects via RabbitMQ

我想知道是否有一种好方法可以通过 Rabbit 队列有效地传输重对象(例如,>100 万个字符串的数组)。

我尝试将数组分成 1000、10000 和 100000 个块。我得到的最快速度是 21 秒,块大小为 10000。

我想到的解决方案类似于流式传输。有 2 个服务,一个向另一个发送包含临时队列名称的请求对象(在发送请求之前创建)。后者收到请求并开始按块发送数组,当它结束时,它发送一种 END-OF-STREAM 标志。

也许有一些优雅的解决方案,比如某些功能或库或其他任何东西。唯一的条件是重对象要使用消息队列传递

有没有人遇到过这样的任务?

好的,我在这里没有收到任何回复,所以请告诉您更多有关我的解决方案的信息。 我所做的是,我只是在第一个服务中创建并声明了一个时间 queue,而第二个服务已经有了 queue 来监听请求。因此,服务 #1 向 queue 发送请求,请求 DTO 包含时间 queue 名称。

发送后,服务 #1 开始收听时间queue,就像这样:

while (condition) {
    Object obj = amqpTemplate.receiveAndConvert(queueToListen, DEFAULT_TIMEOUT);
}

DEFAULT_TIMEOUT 是服务 #1 将收听时间 queue 的时长。例如,循环断路器可以作为特殊的 object 从服务 #2 发送,通知那是流的结尾。

为了获得更高的性能,您还可以简化通过时态传递的 DTO queue。即,如果它们都有一些公共字段,则可以将它们发送一次(在流 header 或其他任何内容中)并排除块 DTO。此外,JSON 属性 名称也可以缩短(例如 value => v),因为本质上我们仍然传递信息字节,并且 object 是序列化的。