For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习软件编程开发等互联网技术,而本文我们就通过案例分析来简单了解一下,软件开发消息队列应用都有哪些问题。
1.如何保证消息不被重复消费(怎么保证幂等)
为什么会重复消费
生产者:也就是客户端,可能会重复推送一条数据到MQ中。有可能是客户端超时重复推送,也有可能是网络比较慢客户端重复推送了数据到MQ中。
MQ:消费者消费完了一条数据,发送ACK信息表示消费成功时,这时候,MQ突然挂了,导致MQ以为消费者还未消费该条消息,MQ恢复后再次推送了该条消息,导致重复消费。
消费者:与上面MQ挂掉情况类似,消费者已经消费完了一条消息,正准备给MQ发送ACK消息但还未发送时,这时候消费者挂了,服务重启后MQ以为消费者还没有消费该条消息,再次推送该条消息。
怎么处理重复消费
每个消息都带一个的消息id。消费端保证不重复消费就可以了,即使生产端产生了重复的数据,当然生产端也好控制下重复数据。
消费端保证不重复消费:
通常方法都是存储消费了的消息,然后判断消息是否存在。
1.先保存在查询
每次保存数据前,先查询下,不存在就插入。这种是并发不高的情况下可以使用。
2.数据库添加约束条件
比如索引
3.增加一个消息表
已经消费的消息,把消息id插入到消息表里面。
为了保证高并发,消息表可以用Redis来存。
2.如何处理消息丢失的问题
消息丢失的原因
生产者:生产者推送消息到MQ中,但是网络出现了故障,比如网络超时,网络抖动,导致消息没有推送到MQ中,在网络中丢失了。又或者推送到MQ中了,但是这时候MQ内部出错导致消息丢失。
MQ:MQ自己内部发生了错误,导致消息丢失。
消费者:有时处理消息的消费者处理不当,还没等消息处理完,就给MQ发送确认信息,但是这时候消费者自身出问题,挂了,确认消息已经发送给MQ告诉MQ自己已经消费完了,导致消息丢失。
如何保证消息不丢失呢?下面谈谈这方面的做法。
3.如何保证消息可靠性传输
整个消息从生产到消费一般分为三个阶段:生产者-生产阶段,MQ-存储阶段,消费者-消费阶段
3.1生产者-生产阶段
在这个阶段,一般通过请求确认机制,来保证消息可靠性传输。与TCP/IP协议里ACK机制有点像。
客户端发送消息到消息队列,消息队列给客户端一个确认响应,表示消息已经收到,客户端收到响应,表示一次正常消息发送完毕。
3.2MQ-存储阶段
消息队列给客户端发送确认消息。存储完成后,才发送确认消息。
3.3消费者-消费阶段
跟生产阶段相同,消费完了,给消息队列发送确认消息。
4.如何保证消息的顺序性
我们日常说的顺序性是什么呢?
比如说小孩早上上学过程,他先起床,然后洗漱,吃早餐,后上学。我们认为他做的事情是有先后顺序的,及是时间的先后顺序,我们用时间来标记他的顺序。
更抽象的理解,这些发生的事件有一个相同的参考系,即他们的时间是对应同一个物理时钟的时间。
如果没有绝对的时间作为参考系,那他们之间还能确定顺序吗?
如果事件之间有因果关系,比如A、B两个事件是因果关系,那么A一定发生在B之前(前应后果)。相反,在没有一个绝对的时间的参考的情况下,若A、B之间没有因果关系,那么A、B之间就没有顺序关系。跟java里的happenbefore很像。
总结一下,我们说顺序时,其实说的是:
在有绝对时间作为参考系的情况下,事件发生的时间先后关系;
在没有绝对时间作为参考系的情况下,一种由因果关系推断出来的happeningbefore的关系;
参考上面的结论,在消息队列中,我们也是以时间作为参考系,让消息有序。
但是,在消息队列中,消息有序会遇到一些问题,下面让我们来讨论这些问题。
消息的顺序性的一些问题
在计算机系统中,有一个比较棘手的问题是,它可以是多线程执行的,而且哪个线程先运行,哪个线程后运行,完全是由操作系统决定的,完全没有规律,是乱序执行。显然与消息队列中的消息有序相悖。
后的结论就是:消息的顺序性,不仅仅是MQ本身存储消息要保证顺序性,还需要生产者和消费者一同来保证顺序性。
顺序性保证
在消息队列中,消息的顺序性需要3方面来保证:
1、生产者发送消息时要保证顺序
2、消息被消息队列存储时要保持和发送的顺序一致
3、消息被消费时保持和存储的顺序一致
生产者:发送时要求用户在同一个线程中采用同步的方式发送。
消息队列:存储保持和发送的顺序一致。一般是在一个分区中保持顺序性。
消费者:一个分区的消息由一个线程来处理消费消息。
5.消息队列中消息延迟问题
你说的消息的延迟是延迟消息队列吗?啊,并不是,是完全2个不同的概念。延迟消息队列是MQ提供的一个功能。消息的延迟,是指消费端消费的速度跟不上生产端产生消息的速度,可能导致消费端丢失数据,也可能导致消息积压在MQ中。所以这里说的消息的延迟,指的是消费端消费消息的延迟。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。