我已将 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 };
这将满足您使用多个主机的要求。
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}",
});
.....