详细介绍了如何实现一个队列的报文ACKredis
前言因为该公司提供的队列对鸡蛋来说太痛苦了,同时也限制了使用其他队列的能力,但是为了确保数据安全,需要一个带有ACK功能的队列。
在本地使用,队列功能的实现是通过L / R推/流行模式。当然,没有办法满足需求(无确认功能),所以我们需要做一个小的调整到Redis的列表(队列)。
一般的想法是在弹出的数据到备份的地方,当一个ACK请求(确认消息消耗)后,备份信息删除;每一次之前,POP需要检查备份队列有过期的数据,如果没有ACK,推到列表,然后从弹出列表。
The following scripts are implemented using Lua, only to be loaded into redis before execution.
消息本身需要包含id属性。
推是没有问题的,本地的(在这种情况下,LPUSH作为一个例子)
流行时间的脚本
当地not_empty =函数(x)
返回(型(x)= =表、(不)x.err)和(# X ~ = 0)
终点
当地的QName = argv { 1 }——队列名称
当地时间= argv { 2 }——在当前时间,这就需要从外部引进,而不能用Redis本身的时间。如果使用自己的时间,这可能会导致备份Redis本身不符时,重放请求。
当地considerasfailmaxtimespan = argv { 3 } -超时设置,当超过一定时间没有ACK消息认为这个消息再次融入团队
当地zsetname = QName 'backup..
当地hashname = QName 'context..
局部TMP = redis.call('zrangebyscore ',zsetname,'信息',数字(时间)- ToNumber(considerasfailmaxtimespan),'limit ',0, 1)。
If (not_empty (TMP)) then
Redis.call('zrem ',zsetname,TMP { 1 })-这里的消息的唯一ID
Redis.call('lpush,QName,redis.call('hget ',hashname,TMP { 1 }))
终点
TMP = redis.call('rpop,12)
如果(TMP)然后
当地的味精= cjson.decode(TMP)
本地ID =味精{ 'id' }
Redis.call('zadd ',zsetname,数字(时间),ID)
Redis.call('hset ',hashname,ID,TMP)
终点
返回TMP
ACK相对简单,只需从集合和散列中删除指定的ID。
地方重点= argv { 1 }
当地的QName = argv { 2 }
Redis.call('zrem,QName .. 'backup键)
Redis.call('hdel,QName .. 'context键)
在使用程序之前,您需要显示两个加载脚本,然后可以直接调用这两个脚本的SHA值。
总结
以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,您可以留言交流,谢谢您的支持。