关于延时消息突然大量插入问题讨论
我通常用延时消息在处理订单未支付超时等相关业务,比如5分钟、10分钟超时,如果说有几十万甚至上百万条延时消息等待消费,会不会对系统有很大压力?单机redis能支撑的延时消息大约是多少?有大佬测试过吗?如果中间件换成rabbitmq又是多少?
高认可度评论:
redis延时队列一般使用zset,写入时间是复杂度,O(log(n)),n是有序集合里的元素数量。
读取性能提取和处理到期的任务: 提取那些时间戳小于或等于当前时间的任务,即通过 ZRANGEBYSCORE 命令。
这个操作的时间复杂度为 O(log(N) + M),其中 M 是返回的元素数量。
其实只要内存够大,redis就不会有太大问题, 性能的瓶颈一般不在生产者, 性能的瓶颈一般在消费者的业务逻辑处理,大量消息,你肯定开多进程,多线程,协程消费。消费业务涉及数据库读写,那么压力就在数据库了。如果消费者数量有限单线程消费,那就会造成消息堆积
redis延时队列一般使用zset,写入时间是复杂度,O(log(n)),n是有序集合里的元素数量。
读取性能提取和处理到期的任务: 提取那些时间戳小于或等于当前时间的任务,即通过 ZRANGEBYSCORE 命令。
这个操作的时间复杂度为 O(log(N) + M),其中 M 是返回的元素数量。
其实只要内存够大,redis就不会有太大问题, 性能的瓶颈一般不在生产者, 性能的瓶颈一般在消费者的业务逻辑处理,大量消息,你肯定开多进程,多线程,协程消费。消费业务涉及数据库读写,那么压力就在数据库了。如果消费者数量有限单线程消费,那就会造成消息堆积
队列不会
如果是队列内存够大就行,只是业务如果处理太慢得考虑延时时间是否能接受。
小体量没为题,大体量不建议用队列,大量的消息堆积,对一些中间件和服务器的压力还是很大的成本也较高,定时任务比较靠谱 :joy:。
我最近在优化代码 redis队列积压了30w条数据占用了0.6G内存
消费的话数据库有压力,redis只要内存够用就行
rabbitmq 延迟消息 用 死信队列 或 插件;
死信队列会造成队头阻塞;
插件不适合大量延迟消息 #issues/72
redis 只要内存够大就行,重复消费消息丢失要自己去保证。
主要是你消费队列,你多服务器去执行队列,然后每台服务器的队列消费的进程数稍微多一些,同时这么多同时执行的时候,你别的中间件如数据库要能扛得住,不然也不行