确保BullMQ队列将数据推送到redis集群中的单个节点

问题描述 投票:0回答:1

我已将 BullMQ 集成到我们的 Node.js 应用程序中,利用 Redis 集群进行生产。根据 BullMQ 和 Redis Cluster 文档,我了解到我们可以在 bullMQ 中创建队列时在密钥中给出一些前缀,队列内部采用密钥模 16384 的 CRC16 (https://docs.bullmq.io/bull/patterns/redis-集群),但这并没有给我们控制数据来决定目标节点,如果2个队列前缀的哈希落在同一节点中,这可能会导致热分片

有没有办法保证BullMQ中的每个队列都将数据推送到集群内预定义的Redis节点?

下面是我的演示代码:

const Redis = require('ioredis');
const { Queue, Worker } = require('bullmq');

const clusterNodes = [
  { port: 6380, host: "127.0.0.1" },
  { port: 6381, host: "127.0.0.1" },
  { port: 6382, host: "127.0.0.1" }
];

const cluster = new Redis.Cluster(clusterNodes);

async function bullMqTest() {

  const queue1 = new Queue(`myQueue1`, {
    connection: cluster,
    prefix: "{queue_1}",
  });
  const queue2 = new Queue(`myQueue2`, {
    connection: cluster,
    prefix: "{queue_2}",
  });
  const queue3 = new Queue(`myQueue3`, {
    connection: cluster,
    prefix: "{queue_3}",
  });
  const queue4 = new Queue(`myQueue4`, {
    connection: cluster,
    prefix: "{queue_4}",
  });
  const queue5 = new Queue(`myQueue5`, {
    connection: cluster,
    prefix: "{queue_5}",
  });
  const queue6 = new Queue(`myQueue6`, {
    connection: cluster,
    prefix: "{queue_6}",
  });


  queue1.add('myJob', { foo: 'bar' });
  queue2.add('myJob', { foo: 'baz' });
  queue3.add('myJob', { foo: 'qux' });
  queue4.add('myJob', { foo: 'xyz' });
  queue5.add('myJob', { foo: 'lmn' });
  queue6.add('myJob', { foo: 'qpr' });
}

module.exports = { pushDataToRedis, fetchDataFromRedis, bullMqTest };
javascript redis message-queue redis-cluster bullmq
1个回答
0
投票

这将满足您使用多个主机的要求。

async function bullMqTest() {

  const redis1 = new Redis(host1);
  const queue1 = new Queue(`myQueue1`, {
    connection: redis1 ,
    prefix: "{queue_1}",
  });

  const redis2 = new Redis(host2);
  const queue2 = new Queue(`myQueue2`, {
    connection: redis2 ,
    prefix: "{queue_2}",
  });

  const redis3 = new Redis(host3);
  const queue3 = new Queue(`myQueue3`, {
    connection: redis3 ,
    prefix: "{queue_3}",
  });
  .....
© www.soinside.com 2019 - 2024. All rights reserved.