当前位置:网站首页>模块八作业

模块八作业

2022-06-11 19:31:00 InfoQ

作业:设计消息队列存储消息数据的 MySQL 表格
【作业要求】
1. 包括表名、字段、索引;2. 用文字描述设计思路和理由,例如:为什么设计某个索引?3. 一页 PPT 即可。
【提示】
1. 需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。


解答:
  • 不同任务的队列建不同的表,比如xx_q, yy_q等。这样可以减少每个消息表的大小,提高性能;减少不同消息之间的干扰,提高SQL执行速度。

  • 表结构
这里以xx_q举例,其主要字段如下:
CREATE TABLE `xx_q` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
 // 自增主键
  `status` tinyint(4) DEFAULT 0,
 // 队列种类:0: todo, 1: done
  `ps` int(11) DEFAULT 0,
 //获得消息的进程号,相当于一个锁 
  `ut` timestamp,
 //时间戳
  `msg` json,
 //消息体参数,json格式保存
  PRIMARY KEY (`id`),
  KEY `ut` (`ps`,`status`)
 //遍历队列的索引, 加快检索消息速度

  • 工作原理:
  • 锁定本次工作消息: update xx_q set ps=connection_id() , status=1 where ps = 0 and status=0 limit 1;
  • 获取消息体: select id, msg from xx_q where ps = connection_id() and status=1;
  • 进行 消息消费
  • 删除消费完毕的消息 delete from xx_q where ps = connection_id() and status=1;

  • 清理僵尸进程占据的消息:定时清除 会话id 已经不存在(异常退出)但status=1 且 僵尸时间超过30分钟的消息
update xx_q set status=0, ps=0 where status=1 and ps not in (`connection_id of 'show processlist'`) and ut < current_timestamp - interval 30 minute;
原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/6252df593e4cccbb8e66fcb06