StackExchange.Redis的“即发即忘”呼叫是否保证按顺序发送?

a1o7rhls  于 2022-12-22  发布在  Redis
关注(0)|答案(1)|浏览(153)

如果我使用fire-and-forget从一个线程进行多个StackExchange.Redis调用,它们是否保证按顺序传递?
用例:我正在添加一个项目到Redis流,然后使用pub/sub触发另一个服务来处理该流。为了避免争用情况,我需要确保在pub/sub消息传递之前将项目添加到流中。

ivqmmu1c

ivqmmu1c1#

虽然大多数StackExchange.Redis API都是线程安全的,但在您的场景中,通过SE.Redis发送的命令的交付顺序并不能得到“保证”,原因如下:

    • 拓扑可以具有多个节点,其中序列中的每个消息被递送到不同的节点以改变拓扑或根据您自己的偏好(CommandFlags.Prefer*/CommandFlags.Demand*);
  • 你的线程可以承载多个任务,这些任务的延续不遵守预期的交付顺序;
  • 由于是发射和遗忘,第一个命令的传送失败将不会停止发送后续命令;

我需要确保在发布/订阅消息传递之前将项目添加到流中。
我建议使用Lua script来解决这个问题,它将在同一个原子单元内针对同一个节点执行您的命令:

  1. redis.call('XADD', 'foo', '*', 'bar', 'baz')
  2. redis.call('PUBLISH', 'foo-added', '')

相关问题