本人负责系统基础框架的搭建和数据处理,数据的大致流程:
主要包括:
- 搭建RabbitMQ和ElasticSearch服务
- 封装C++客户端提供给订单服务/账务服务等服务调用
- 把客户端写入RabbitMQ的数据同步到ElasticSearch
- 管理端通过查询ElasticSearch而不是数据库获取交易数据
上线后出现一个严重的问题:有些交易数据查询不到。分析后发现a)客户端没有报错; b)ElasticSearch没有订单数据; c)同步RabbitMQ数据到ElasticSearch的服务没有相关的日志。那么可以认定问题是RabbitMQ的客户端并没有把数据成功的发送给RabbitMQ.
定位问题
首选想到的会不会是线上的数据量大导致的,于是写了个测试用例在开发环境进行压测:https://github.com/TomeC/cookies/blob/master/mq_test.cpp,可以用Python去RabbitMQ拉取数据解析后看id是不是递增的,然而并没有发现问题。
在开发环境和测试环境是没有出现过这个问题的,而它们和线上的不同在于线上的环境多了个HAProxy.我是不支持加代理的,因为两个RabbitMQ一主一备,客户端自己切换完全没有问题,而如果加上代理的话一个肯定是不行的,万一这个HAProxy挂了那系统一样不可用,所以至少需要两台代理,从使用的角度来看还不如我直连两个RabbitMQ。之所以上线时加上代理是运维的意见,他们认为将来扩展的话直接修改代理代理就好了,不需要动服务的配置。这是完全合理的考虑,于是就临时加上了。
超时时间单位为秒,默认值为60,心跳包每半个超时时间发送一次。 丢失了两个心跳包, 连接被认为不可抵达。 不同的客户端有不同的提示, 但tcp连接都会被关闭。