赞
踩
在我们的很多编程的时候都会听到mq,这个东西也在很多地方体现出来了作用?先来总体看一下消息队列是什么?
消息队列是一种用于进程间通信的技术,能够解耦发送和接收消息的组件,提供异步消息传递、负载均衡和弹性伸缩等功能。
它的基本原理是将消息存储在一个队列中,由消息生产者(producer)将消息发送到队列,消息消费者(consumer)从队列中取出消息进行处理。生产者和消费者可以是同一个系统的不同部分,也可以是完全独立的系统。
以下是消息队列的一些关键特性和优点:
常见的消息队列系统有 RabbitMQ、Apache Kafka、ActiveMQ 和 Amazon SQS 等,每种系统有不同的特点和适用场景。选择合适的消息队列系统,需要根据具体应用场景的需求,如消息吞吐量、延迟、持久化需求、分布式特性等进行评估。
通过上面的总结,可以很清楚的看到,mq的功能,这些功能在很多时候会有作用,尤其对于异步进行消息处理,还有服务之间的解耦,都会大大提升编写程序的整体性能。
确保消息在存储中不会丢失,特别是在系统崩溃或重启的情况下。可以使用日志或数据库来持久化消息。
这个是很必要的条件,当生产者将数据存放到消费队列之后,消费者还没有来得及进行消息,如果出现问题,那这些数据是要进行落盘的,这让我想到了之前和别人讨论go中channel是否可以实现,如果学过这门语言,可以清楚的了解到确实可以通过管道来进行异步通信,但是,管道需要进行开辟空间进行存储,这样的话,当使用管道作为mq的时候,就需要去维护大量数据进行落盘的问题,还有就是宕机之后需要处理的事情。
系统应具备容错能力,确保在部分节点故障时仍能正常工作。这可以通过多节点集群和主从复制来实现。
使用mq的时候,大部分都是高并发,这个时候会有多个大量数据进行涌入,需要做好万全的准备,保证能够不出现问题,或者出现问题之后,能够很快时间就进行恢复。多节点可以帮助提高容错率。
要保证幂等性,当同一个客户进行多次请求的时候,只需要进行一次消费。并且当数据到达消费的时候,要保证消费。不能出现没有对数据进行消费的问题。
确保消息按照发送的顺序被处理,这在某些应用场景中非常重要。可以使用分区(Partitioning)技术来保证同一分区内的消息顺序。
mq是一个队列,学过数据结构的都知道先进先出这个问题,所以mq里面的数据需要保证顺序。
系统应能够处理不断增长的消息量和消费者数量。这可以通过水平扩展(添加更多节点)来实现。
当数据量提升的时候,可以通过增加节点的方式来实现水平拓展,也就是主从多节点的问题。
系统应能在网络故障、节点崩溃等情况下保证消息不丢失或重复处理。
在分布式的系统中,很多问题的出现就是因为复杂多变的文罗环境,导致信息延迟之类的问题,当使用mq的时候,需要保证就算出现了这些问题,中间的消息也不会丢失,数据处理的幂等性的问题也不会出现。
优化消息的吞吐量和延迟,确保系统能高效处理大量消息。可以采用批处理(Batch Processing)和异步I/O等技术。
高并发的情况下,对于性能是必不可少的,所以需要保证整提性能。
确保消息在传输和存储中的安全,防止未经授权的访问。可以使用加密和访问控制机制。
定义统一的消息格式,确保生产者和消费者能够正确解析和处理消息。常用的格式有 JSON、XML、Protobuf 等。
对于mq需要消息统一,这样可以方便前后进行序列化,反序列化。
提供监控和管理工具,帮助运维人员查看系统状态、性能指标、错误日志等。可以集成Prometheus、Grafana等监控工具。
在实现消息队列的整个过程中,需要清楚的就是要保证整个数据的不丢失,那什么时候可能会数据丢失呢?又有什么策略呢?那肯定就是三个部分了,生产者,消费者,以及队列之中。
对于redis就不进行过多的讲解,主要来看看其中的数据结构用来实现消费队列的优缺点
适用场景
实现方法
RPUSH
将消息添加到队列末尾。LPOP
从队列头部取出消息。可以使用 BRPOP
进行阻塞等待。优点
缺点
适用场景
实现方法
ZADD
将消息添加到有序集合,分数可以是时间戳或优先级。ZRANGE
或 ZRANGEBYSCORE
取出消息,并使用 ZREM
删除已处理的消息。优点
缺点
适用场景
实现方法
PUBLISH
将消息发布到频道。SUBSCRIBE
订阅频道并接收消息。优点
缺点
适用场景
实现方法
HSET
将消息存储为哈希表中的字段。HGET
或 HSCAN
获取消息。优点
缺点
适用场景
实现方法
XADD
将消息添加到流。XREAD
或 XREADGROUP
读取消息,并使用 XACK
确认处理。优点
缺点
通过上面的了解,就会发现在redis中有很多的可以用来实现mq,那么接下来主要是通过stream实现mq。
具体的redis指令就不做过多的分析,接下来就要是通过小徐先生的几张图,来了解里面的具体流程,让大家先清楚一个大概过程,然后再进行深究具体问题。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
下面这个是别人公众号上面的图,利用这个图,可以很清楚的看到客生产者使用redis的命令将数据放到redis的streams里面之中,然后消费者通过获取信息进行消费,如果消费成功的话,就是要给redis回应一个ack,这样就完美的保证了数据被消费。
通过上面的这个流程图,好好的缕一下整个的流程
failCnt++
)。failCnt++
)。从以上的内容,可以很清楚的了解到这个的整体过程,所以接下来就最重要的是代码的梳理了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。