1、消息幂等性
1.消息幂等:
当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响,那么这整个过程就可实现消息幂等。
2. 场景:
如果因网络不稳定等原因导致消息重复投递,消费者重复消费了该消息
3.处理方式:
因为 Message ID 有可能出现冲突(重复)的情况,所以真正安全的幂等处理,不建议以 Message ID 作为处理依据。最好的方式是以业务唯一标识作为幂等处理的关键依据,而业务的唯一标识可以通过消息 Key 设置。
//发送
Message message = new Message();
message.setKey("ORDERID_100");
SendResult sendResult = producer.send(message);
//消费者收到消息时可以根据消息的 Key,即订单号来实现消息幂等:
consumer.subscribe("ons_test", "*", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
String key = message.getKey()
// 根据业务唯一标识的 Key 做幂等处理
}
});
2、Topic 与 Tag 最佳实践
1. Topic 与 Tag 都是业务上用来归类的标识,区分在于 Topic 是一级分类,而 Tag 可以理解为是二级分类
2. Topic:消息主题,通过 Topic 对不同的业务消息进行分类。
3. Tag:消息标签,用来进一步区分某个 Topic 下的消息分类,消息从生产者发出即带上的属性。
3、在分布式系统中是如何处理高并发
由于在高并发的环境下,来不及同步处理用户发送的请求,则会导致请求发生阻塞。比如说,大量的insert,update之类的请求同事到达数据的Mysql,直接导致无数的行锁表锁,甚至会导致请求堆积很多,从而出发too many connections错误,使用消息队列可以解决【异步通信】