程序热启动方案讨论

2017-05-31 10:28:09 +08:00
 qq450255457

业务:用户发起购买请求-->将数据放入购买队列-->经过 N 个队列-->将购买结果告诉用户

场景:目前在一台机器上部署 3 个服务 server.py,当后台服务拿到原始数据后,一直是在同一个 Redis 的 N 个队列中轮流处理,处理完成才存入 DB,所以如果直接杀掉进程重启服务不仅会导致客户端无法请求,还会丢失部分数据。

方案:利用 nginx 的热重启与负载均衡,然后对后台服务进行拆分:一个后台服务对应着一个 Redis,这样后台服务之间就不会有数据影响,数据统计等定时任务单独作为一个服务。这样就有以下几个服务:

服务 A-->Redis a

服务 B-->Redis b

服务 C-->Redis c

数据统计等定时任务,服务 D

各位同学,场景如上,你们还有什么更好的方法或者建议么,欢迎大家来探讨一下。

4460 次点击
所在节点    Python
22 条回复
sylecn
2017-05-31 20:53:20 +08:00
@qq450255457 那就是要在 shutdown 的时候停止循环啊。不然如果一直有新请求你就一直没法关闭了。

队列都是这样处理。redis 和 rabbitmq 都得这样。你得在某个时刻停止从队列取消息,才可能做到重启进程不丢消息。
SlipStupig
2017-06-01 07:45:13 +08:00
目前我就在用 redis,目前出现过数据全部丢失的情况,redis 3.0+可以用 aof+rdb 持久化保持,用了之后数据几乎没出现过丢失,但是如果你是单机模式千万不要用,性能下降的厉害,如果是 cluster 可以用 slave 节点做 aof,应该是能保证节点数据不丢失,关于自动重启,redis 可以做到,3.2+支持 supervised

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/364850

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX