进程间通信
互联网的通讯时网络的基础,一般情况下互联网的资源数据对储存在中心服务器上,一般情况下个体对个体的访问仅限于局域网下,在公网即可完成资源的访问,如各种网站资源,下载资源,种子等。网络通讯都是基于应用程序到应用程序的通讯,例如访问网页必须要借助浏览器,各种手机app,pc端应用等。应用程序使用http协议或者tpc/udp协议实现通讯。
在往小的说就是应用程序内部线程的通讯了,一般来说一个应用程序有一个进程,一般一个进程包含多个线程,若干线程服务与进程共同完成进程的功能,显然都是为进程服务,那么线程之间的通讯是无法避免的,最常见的就是共享数据,多个线程对对同一数据操作。
了解微服务的可以知道rpc协议,这个也是进程的通讯,但不同的是rpc协议不是面向数据的而是面相方法的,rpc为远程过程调用,能够想调用本地的方法一样调用远程机器上的方法,若把方法比作线程,那么rpc就是实现远程主机的线程调用。
对与本机上各个线程协调来完成进程的任务,因此线程通讯是必要的,这里的线程通讯是远程的线程通讯,在同一主机上,线程就好比各个方法,在开发阶段方法互相调用就实现了数据共享,并存在与计算机的内存中,只有在远程线程通讯时才需要考虑安全,准确,快捷等特性。
消息队列
上一节说到线程通讯服务于进程,那么线程之间必须要通讯,线程通讯最主要的方式就是数据共享。那么如何实现数据共享并保证书的准确性呢?
远程线程通讯并在保证数据安全可靠的主流实现方案时消息队列
。使用消息队列在线程线程通讯时实现了数据共享,并保证数据安全可靠。
消息队列(Message Queue,简称MQ)
是一种应用程序间的通信方法,最主要的功能就是实现数据共享。
简单来说:消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。
消息队列是分布式系统中的一个重要组件,它允许不同的应用程序之间通过消息的形式进行异步通信。这种通信机制可以提高系统的性能和可伸缩性,同时降低系统各部分之间的耦合度。消息队列的主要优点包括:
- 异步处理:消息队列允许系统的不同部分独立工作,不需要即时响应对方,这样可以提高系统的响应速度和处理能力。
- 削峰填谷:在高流量场景下,消息队列可以作为缓冲,帮助系统应对短时间内的大量请求,防止系统过载。
- 解耦应用:通过消息队列,应用之间不必直接通信,这有助于降低系统各部分之间的依赖性,使得系统更加灵活和稳定。
- 顺序保证:消息队列通常保证消息的传输顺序,确保数据一致性和处理的准确性。
- 可靠性:消息队列提供了消息存储机制,即使在消费者未准备好接收消息时,也能保证消息不会丢失。
此外,在使用消息队列时,可能会涉及到一些潜在的问题,如消息的顺序性、重复消费、消息丢失、系统复杂度增加等。因此,选择合适的消息队列技术并正确配置使用是非常重要的。常见的消息队列技术有RabbitMQ、Kafka、ActiveMQ、RocketMQ等,它们各自有不同的特点和适用场景。
总的来说,消息队列是现代软件架构中不可或缺的一部分,它在提高系统性能、保证数据一致性和系统解耦方面发挥着重要作用。
消息队列功能
消息队列主要用于在分布式系统中存储转发消息,一般有异步处理,应用解耦,流量削峰和消息通讯四个场景。
- 异步处理
异步处理,就是将一些非核心的业务流程以异步并行的方式执行,从而减少请求响应时间,提高系统吞吐量。
下单为例,用户下单后需要生成订单、赠送活动积分、赠送红包、发送下单成功通知等一系列业务处理。假设三个业务节点每个使用100毫秒钟,不考虑网络等其他开销,则串行方式的时间是400毫秒,并行的时间只需要200毫秒。这样就大大提高了系统的吞吐量。
- 应用解耦
应用解耦,顾名思义就是解除应用系统之间的耦合依赖。通过消息队列,使得每个应用系统不必受其他系统影响,可以更独立自主。
以电商系统为例,用户下单后,订单系统需要通知积分系统。一般的做法是:订单系统直接调用积分系统的接口。这就使得应用系统间的耦合特别紧密。如果积分系统无法访问,则积分处理失败,从而导致订单失败。
加入消息队列之后,用户下单后,订单系统完成下单业务后,将消息写入消息队列,返回用户订单下单成功。积分系统通过订阅下单消息的方式获取下单通知消息,从而进行积分操作。实现订单系统与库存系统的应用解耦。如果,在下单时积分系统系统异常,也不影响用户正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作。
- 流量削峰
流量削峰也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
以秒杀活动为例,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列,秒杀业务处理系统根据消息队列中的请求信息,再做后续处理。
如上图所示,服务器接收到用户的请求后,首先写入消息队列,秒杀业务处理系统根据消息队列中的请求信息,做后续业务处理。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。
- 消息通讯
消息通讯是指应用间的数据通信。消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等点对点通讯。
部分参考:秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
消息队列框架
消息队列学习网站导航
RocketMQ-中文
RabbitMQ Tutorials-English
Apache kafka中文手册
redis实现的消息队列
消息队列FreeRTOS
消息队列的概念