接上一节的继续,上一节说过了因近期接手其他部门项目,发现诸多问题.关于mysql 并发 处理已经讲过,没有看过的同学可以去这里:http://xytong.cc/archives/87 。
本节讲讲如何正确地处理消息队列,此项目后台进程消息传递用的memcacheq,出现了很多问题列举如下:
1.将诸多业务类型的数据(例如推送微信模板消息,硬件设备上报错误处理,用户操作逻辑)都塞到同一个队列里,即用同一个key值进行存储。但有些业务例如:用户操作硬件设备的处理逻辑是不能并发处理的,必须按顺序进行。有些业务是可以并发处理的,例如推送微信模板消息是可以进行并发处理的。
导致:后台必须你使用单进程单线程处理,晚上用户访问量大的时候,后台处理很缓慢,担心并发出错还不能多开进程去处理,消息队列堵塞特别严重(后台取出数据处理的速度小于外部进程插入的速度)。
2. memcacheq 这种消息队列产品缺点还是不少的:
小众使用,已经停止维护了目测(最后一次版本更新08年)
api几乎没有,数据存取只有get set,查询队列也没有官方工具,居然还要通过telnet查看统计数据。我个人是毕竟失望的对此,比如:可以选择或从头或从尾部读取、队列数据查询内容,一次取出n条数据,阻塞模式查询数据(省得应用层程序要频繁询问队列有无数据然后sleep,再不停进行上述循环,浪费硬件资源 ) 等等统统没有,google 搜索也没有找到有效文档。
redis 在这消息队列方面完全可以满足我的需求嘛,于是费了一番尽力,将消息队列由memcacheq 切换至redis,目前线上产品已经使用redis一周运行稳定
替换前已经做好了如下方案:
1.分析队列处理的业务数据,将之完全剥离开,一个业务一个队列,这样的好处是:
1.1.平日数据量最大的是微信模板消息,开多个进程去并发处理就是了。
1.2.按业务分开后,同一个业务处理不会因其他业务处理阻塞而推后执行,这个在之前也是频频出现的。
2.替换要分布进行的,先将数据插入切换至redis,用备机后台进程处理redis 队列。
旧的数据依旧在memcacheq,依然在老机器后台进程处理,待memcacheq数据处理完毕,则关闭memcacheq,停止使用备机,这样即实现了消息队列切换平稳过渡。
3.用brpop,减少后台进程查询redis队列频率。我这里设置的是超时3秒,brpop 超时2s,然后继续while循环进行brpop。
4.应用层的切换还是比较简单的,只需要把以前的set,get方法调用重新换成调用redis接口就行了,一定要做错误日志记录、检测报警,结构性的切换很有可能会忽略掉一些地方,这时候就要从日志种寻找蛛丝马迹了。
centos 7 +redis 3.26安装配置管理
redis安装:
比较简单的,去官网下载压缩包解压直接make就可以了。
1.wget http://download.redis.io/releases/redis-3.2.6.tar.gz
2.tar xzf redis-3.2.6.tar.gz
3.cd redis-3.2.6
4.make
5.make test 测试是否编译成功
centos 7安装可能会遇到以下问题:
1.error: jemalloc/jemalloc.h: No such file or directory
异常原因:部分编译依赖或原来编译遗留出现的问题
解决方案:make distclean。清理一下,然后再make。
2.. 在make成功以后,需要make test。在make test出现异常。
couldn’t execute “tclsh8.5”: no such file or directory
异常原因:没有安装tcl
解决方案:yum install -y tcl。
REDIS配置:
我将redis编译完毕所需的文件都放入了/usr/local/redis/目录
2018.09.18补充:
将程序文件移至/usr/local/redis 目录
cd /usr/local/src/redis/redis-4.0.11/src
cp redis-cli redis-server redis-sentinel redis-benchmark redis-check-aof redis-trib.rb
/usr/local/redis
将配置文件移至/usr/local/redis 目录
cp /usr/local/src/redis/redis-4.0.11/redis.conf /usr/local/redis
redis 管理命令
启动redis:/usr/local/redis/redis-server /usr/local/redis/redis.conf
关闭redis: /usr/local/redis/redis-cli -h 192.168.100.32 -p 6379 -a password shutdown
客户端登陆:/usr/local/redis/redis-cli -h 192.168.100.32 -p 6379 -a password
修改redis.conf配置
1.logfile ,pid(pidfile),dir(dir)路径,redis启动用户要有可写权限
2.timeout 客户端连接超时 60s
3.启动ip修改为:bind 0.0.0.0
4.守护进程方式启动 :daemonize yes
5.根据业务类型重要性修改保存的频率 ,例如: save 60 1
正式环境部署还需要做以下几点:
1.必须用普通用户身份运行redis
添加redis 启动用户: user add redis (必须有/bin/bash权限,否则不能su切换)
2.开机自启动
vim /etc/rc.local
添加一行: su – redis -c “/usr/local/redis/redis-server /usr/local/redis/redis.conf “
注意:
记得替换” – 为 半角字符
作者: 白金马桶