mysql 消息队列_一个简单的 MySQL 批量事务消息队列

基于 MySQL 的批量事务消息队列

消息队列本质上是一个存储介质,通常是链表结构,不同的进程或线程可以向消息队列中写入或读取消息。消息队列的使用场景有很多,比如异步处理任务、应用解耦、流量削锋等等。通常我们使用消息队列,都是直接使用 MNS、RocketMQ、Kafka 等产品。但某些场景下这些产品也难以满足,或者使用起来成本比较高,比如:批量创建大量(比如 1 万条)消息,并且要么都写入,要么不写入。这时候就需要考虑一些别的方案了。总的来说该场景主要需要满足以下几个条件:批量创建消息

批量创建要保证事务

消费不能被重复消费

接下来就以上述的场景为例,分别分析不同消息队列所面临的问题,以及如何使用 MySQL 来实现一个支持批量事务消息队列。

基于 MNS / RocketMQ

MNS 是阿里云提供的一个分布式消息服务,RocketMQ 是阿里云基于 Apache RocketMQ 构建的分布式消息中间件。

MNS 可以使用 SendMessage 接口向队列发送一条消息,也可以使用 BatchSendMessage 批量创建消息,但该接口一次最多发送 16 条消息。而 RocketMQ 不支持批量创建消息。

所以对于一般的消息队列产品,只能通过多次调用发送单条/(有限的)多条创建消息的接口,来实现批量创建大量消息。但多次调用接口,就很难保证这些调用的事务性,很难保证这一批消息要么都成功写入消息队列,要么都不写入。

综上,MNS、RocketMQ 等消息队列,比较难实现事务性地批量创建消息。

基于 Redis Lists

Redis 是一个经常用来做消息队列的数据库。Redis 的 lists 是一个链表,基于 lists 可以很方便实现一个轻量级的消息队列。

lpush/rpop 或 lpush/brpop

消息队列的操作,就是写入和读取,所以首先可以想到的是把 list 作为一个消息队列。对于生产者,使用 lpush 写入数据到队列头部,消费者通过轮询的方式,每次循环使用 rpop 从队列尾部取出一条消息进行处理。通过 rpop 取出数据后,数据就不在 list 中存在了,所以不同消费者就只能取到不同的数据。另外消费这也可以通过 brpop 阻塞式地从 list 中读取消息,brpop 会在 list 中没有任何元素的时候阻塞连接,这种方式效率更高。

从 2.4 开始,lpush 支持传入多个 elements:LPUSH key element [element ...],这样我们可以很方便使用 lpush 批量向队列中写入消息。

但 lpush/rpop 这种方案实现的消息队列是不可靠的。例如,当消费这通过 rpop 取出消息后,出现了网络问题或者消费者端崩溃了, 那么这个消息就丢失了。所以一般不能简单

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值