Open Alice52 opened 4 years ago
要求
rabbit MQ: 队列模型
RocketMQ: 发布 - 订阅模型
Kafka: 发布 - 订阅模型
activeMQ
Pulsar: 采用存储和计算分离的设计
rabbitmq 通过 EXCHANGE 将 同一份消息
发送到多个 QUEUE
其他 MQ 产品是将消息发送到 TOPIC, 订阅者逻辑接受
RabbitMQ
RocketMQ
Kafka
由于网络或服务器故障丢失
, "请求 - 确认" 机制
消息空洞
有序性
消息的有序性
生产阶段
正确处理返回值或者捕获异常
try {
RecordMetadata metadata = producer.send(record).get();
System.out.println(" 消息发送成功。");
} catch (Throwable e) {
System.out.println(" 消息发送失败!");
System.out.println(e);
}
producer.send(record, (metadata, exception) -> {
if (metadata != null) {
System.out.println(" 消息发送成功。");
} else {
System.out.println(" 消息发送失败!");
System.out.println(exception);
}
});
存储阶段
消费阶段
def callback(ch, method, properties, body):
print(" [x] 收到消息 %r" % body)
# 在这儿处理收到的消息
database.save(body)
print(" [x] 消费完成 ")
# 完成消费业务逻辑后发送消费确认响应
ch.basic_ack(delivery_tag = method.delivery_tag)
channel.basic_consume(queue='hello', on_message_callback=callback)
At least once + 幂等消费 = Exactly once
利用数据库的唯一约束实现幂等
为更新的数据设置前置条件
记录并检查操作
检查消费状态,然后更新数据并且设置消费状态
发送端性能优化: 增加批量或者是增加并发
消费端性能优化: 增加并行的消费者需要同步扩容分区数量
排查
核心
分布式系统
knowledge list
应用
实现技术
哪些问题适合使用消息队列来解决
流量控制:
自身能力范围内尽可能多地处理请求, 拒绝处理不了的请求并且保证自身运行正常issue