丢消息怎么办?
场景是这样。非持久化消息堆积到一定程度会写到文件里,这个过程会阻塞所有的操作,持续20到30秒。当客户端发送消息完调用close时,会期待服务端响应,如果超过15秒后还没回答,直接调用socket的close关闭tcp连接。这时,客户端发送的消息还在服务端的缓存中等待处理,不过由于心跳包的设置,会导致发生socket异常,把缓存中的数据作废掉,没处理的效果会丢失。
解决方法
- 增加机器,及时消费数据。
- 非持久化数据变成持久化数据。
持久化消息非常慢。
默认情况下,非持久化数据是异步发送,持久化数据是同步发送。但是在开启事务之后,消息都是异步发送。所以在发送持久化数据时,也开启事务模式。
消息不均匀消费。
解决方法是设置prefetch设为1,每次处理1条消息,处理完再取。
网友评论