将 Hangfire 与 Redis 一起使用,是否有一种简单的方法可以使用密钥哈希将作业分区到各种 Redis 服务器?

Using Hangfire with Redis, is there an easy way to partition jobs to the various Redis servers using key-hashes?

我们目前正在将 Hangfire 与 MSSQL 结合使用,并希望通过迁移到 Redis 来提高我们任务的吞吐量。

通过 key-hash 进行分片(分区)非常简单、可扩展且易于维护。我们目前无法访问 Redis 集群。所以我们要满足两个要求:

这样我们就可以在 'n' 个 Redis 服务器之间分配任意数量的作业。

我意识到 Hangfire 有两个部分:存储和作业。我很好奇这两个组件在 Redis 分片环境中如何工作。

我意识到 Twemproxy 等第三方组件有助于解决这些问题,但由于密钥散列方法非常简单,我认为在实施 Twemproxy 之前我会用尽所有途径。

谢谢!

你对 Hangfire 的两个部分的辨别是正确的:引擎对存储一无所知,反之亦然。

使用锁定机制从存储中提取作业:

当 Hangfire 启动时,它会启动与配置一样多的线程(工人数)。每个 Worker 然后向存储询问是否有要处理的作业,将它们移动到处理状态。该操作必须使用某种锁定机制进行。

这个锁如何实现取决于存储本身,我相信在SQL服务器上存储使用UPDATE MERGE SQL语句,而官方Redis版本使用阻塞命令(BRPOPLPUSH和喜欢)而其他人像我一样,利用 Redis 发布-订阅机制。

根据您的要求,我可以谈谈that Redis 实现

  • Redis服务器列表通过Storage Connection字符串传递给存储,如"redis0:6380,redis1:6380,allowAdmin=true"(详见this page
  • 据我所知,Redis 客户端 supports Redis Cluster 可以分片密钥并让客户端连接到正确的 Redis 实例

我在生产中使用带有 Redis 的复制 Hangfire 服务器,但我只使用 Redis 主从故障转移,而不是 Redis 集群