写点什么

模块 8

用户头像
Geek_35a345
关注
发布于: 4 小时前

场景分析

使用 MySQL 设计消息队列存储。

应该每一个队列一张表,需要操作消息队列的时候,有可能出现表级锁的使用。多个消息队列一张表的情况下,可能造成不必要的阻塞。

设计思路

消息队列的作用有:异步化、解耦和消除峰值等。目前异步化对于我来说使用最频繁,在很多业务场景下,我们可以将实时性要求较低的请求转为异步处理,减小系统负载压力,提高系统稳定性。在离线数据异步处理过程中,消息队列要满足以下要求:

  • 消息不能丢失,即使在系统失败的情况下。消息一旦被插入就一定会被至少处理一次(只被处理一次是最好的,但是实现起来有难度,所以只要求 at-least-once semantic);

  • FIFO 顺序。(mysql id 自增可满足此特性。当然,可以设计特殊参数做特殊处理)

  • 支持多生产者(mysql 支持并发操作,支持此特点)

  • 支持多消费者。每个消息只能被其中一个消费者处理(业务的处理需要考虑幂等性)。

表设计

CREATE TABLE message_queue (  id BIGINT PRIMARY KEY AUTO_INCREMENT, '自增主键,用于FIFO'  owner VARBINARY(255), '消息当前持有者'  message VARBINARY(255) NOT NULL,'消息体'  status tinyint(2) NOT NULL DEFAULT '0' COMMENT '0新建 1消费中 2成功 3失败 4需重试',  create_time int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',  update_time int(11) NOT NULL DEFAULT '0' COMMENT '状态变更时间,时间用于统计消费超时,便于其它消费者获取消息进行消费');
复制代码


用户头像

Geek_35a345

关注

还未添加个人签名 2019.03.26 加入

还未添加个人简介

评论

发布
暂无评论
模块8