大型网站架构之分布式消息队列

news/2024/5/20 11:31:32/文章来源:https://blog.csdn.net/qq_37675827/article/details/77978497

一、消息队列概述

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。

目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

二、消息队列应用场景

以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。

2.1异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。

(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。(架构KKQ:466097527,欢迎加入)

 

(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

 

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。

因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)。

 

小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

 

按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍。

2.2应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:(架构KKQ:466097527,欢迎加入)

 

传统模式的缺点:

1)  假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;

2)  订单系统与库存系统耦合;

如何解决以上问题呢?引入应用消息队列后的方案,如下图:

 

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
  • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
  • 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。

2.3流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

  1. 可以控制活动的人数;
  2. 可以缓解短时间内高流量压垮应用;

 

  1. 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;
  2. 秒杀业务根据消息队列中的请求信息,再做后续处理 

    五、常用消息队列

    一般商用的容器,比如WebLogic,JBoss,都支持JMS标准,开发上很方便。但免费的比如Tomcat,Jetty等则需要使用第三方的消息中间件。本部分内容介绍常用的消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka)以及他们的特点。

    5.1 ActiveMQ

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

    ActiveMQ特性如下:

    ⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

    ⒉ 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)

    ⒊ 对spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

    ⒋ 通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

    ⒌ 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

    ⒍ 支持通过JDBC和journal提供高速的消息持久化

    ⒎ 从设计上保证了高性能的集群,客户端-服务器,点对点

    ⒏ 支持Ajax

    ⒐ 支持与Axis的整合

    ⒑ 可以很容易得调用内嵌JMS provider,进行测试

    5.2 RabbitMQ

    RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。支持多种客户端,如:python、Ruby、.NET、Java、JMS、C、php、ActionScript、XMPP、STOMP等,支持AJAX,持久化。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    结构图如下:(架构KKQ:466097527,欢迎加入)

    几个重要概念:

    Broker:简单来说就是消息队列服务器实体。

      Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

      Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

      Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

      Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

      vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

      producer:消息生产者,就是投递消息的程序。

      consumer:消息消费者,就是接受消息的程序。

      channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

    消息队列的使用过程,如下:

    (1)客户端连接到消息队列服务器,打开一个channel。

    (2)客户端声明一个exchange,并设置相关属性。

    (3)客户端声明一个queue,并设置相关属性。

    (4)客户端使用routing key,在exchange和queue之间建立好绑定关系。

    (5)客户端投递消息到exchange。

    exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

    5.3 ZeroMQ

    号称史上最快的消息队列,它实际类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。

    引用官方的说法: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一 层封装。ZMQ让编写高性能网络应用程序极为简单和有趣。”

    特点是:

    • 高性能,非持久化;
    • 跨平台:支持Linux、Windows、OS X等。
    • 多语言支持; C、C++、Java、.NET、Python等30多种开发语言。
    • 可单独部署或集成到应用中使用;
    • 可作为Socket通信库使用。

    与RabbitMQ相比,ZMQ并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,更像一个底层的网络通讯库,在Socket API之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的API接口。支持“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”三种基本模型和扩展模型。

     

    ZeroMQ高性能设计要点:

    1、无锁的队列模型

       对于跨线程间的交互(用户端和session)之间的数据交换通道pipe,采用无锁的队列算法CAS;在pipe两端注册有异步事件,在读或者写消息到pipe的时,会自动触发读写事件。

    2、批量处理的算法

       对于传统的消息处理,每个消息在发送和接收的时候,都需要系统的调用,这样对于大量的消息,系统的开销比较大,zeroMQ对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息。

    3、多核下的线程绑定,无须CPU切换

       区别于传统的多线程并发模式,信号量或者临界区, zeroMQ充分利用多核的优势,每个核绑定运行一个工作者线程,避免多线程之间的CPU切换开销。

    5.4 Kafka

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群机来提供实时的消费。

    Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性:

    • 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。(文件追加的方式写入数据,过期的数据定期删除)
    • 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
    • 支持通过Kafka服务器和消费机集群来分区消息。
    • 支持Hadoop并行数据加载。

     

    Kafka相关概念

    • Broker

    Kafka集群包含一个或多个服务器,这种服务器被称为broker[5]

    • Topic

    每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

    • Partition

    Parition是物理上的概念,每个Topic包含一个或多个Partition.

    • Producer

    负责发布消息到Kafka broker

    • Consumer

    消息消费者,向Kafka broker读取消息的客户端。

    • Consumer Group

    每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

     

    一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_780041.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站服务器防御恶意攻击的方法

网站服务器防御恶意攻击的方法!随着互联网络带宽的增多和多种ddos攻击黑客工具的不断发布,使其ddos攻击越来越频繁。如今DDoS攻击已不单单只出现在大型网站中,很多中小型网站甚至是个人网站都可能面临着被DDoS攻击的风险。发动ddos攻击的原因…

选择服务器后怎么确保网站安全?

当企业网站完成了服务器的选择,是选择云主机还是VPS还是虚拟主机,它就完成了搭建的一大部分。当网站成功建好之后,我们要做些什么才能够确保网站的运作安全? 1、定期检查网络情况。除了选择信誉良好的计算机房外,还需要定期检查…

DDoS攻击怎样让网站打不开的?

如果您对DDoS攻击有所了解,您很可能已经注意到DDoS攻击会如何危害您的网站。DDoS攻击通过拖延业务和使网站脱机而对全球的企业和网站造成严重破坏。根据NSFOCUS发布的报告显示:全球每两分钟平均发生1.29次DDoS攻击,其中,93.2%的DD…

网站一定要有SSL证书吗?

网站必须要有SSL证书吗?没有一件事情是绝对的,任何东西都是建立在需求上,网站是否有需要安装SSL证书主要还是看用户的需求。如何判断我的网站是否需要安装SSL证书呢?可以来看看SSL证书的功能,是否可解决目前网站的需求…

网站为什么要使用https?开通443端口

之所以会实现https加密保护,主要是因为该网站使用了SSL证书。现在很多网站都会使用SSL证书对网站数据进行传输加密,尤其是银行、金融、电商类的网站。但很多人对于https的理解都存在不少误区,比如https会让网站访问速度变慢、消耗服务器资源、…

网站被攻击,被入侵了怎么办?怎么防止入侵?

互联网互联网时代,越来越多的企业或个人站长都做起了线上业务,当网络跨数发展的同时也存在着问题,网站攻击简直防不胜防,那么当网站受到攻击的时候不要过度惊慌失措,要先静下心查看网络被攻击的原因,受到什…

论坛网站有必要安装SSL证书吗?

1)SSL证书可加密敏感信息使其不被泄露 首先SSL证书可以使你的网站更加安全可信,SSL证书主要是为了保障通过Internet发送的敏感信息能够加密,防止数据泄露,和第三方恶意程序或者非法人员窃取的一种防护协议。如果未使用SSL证书&am…

网站打开速度慢,卡顿如何是好

网站服务器区域选定在中国,网站服务器区域的选定问题比较严格,因为国内在网络区域性划分很细,比如说南方代表网络就是电信,那么北方的肯定就是网通等等,那么当你网站服务器就会面临响应速度不及时或者是某些情况下&…

简单的说下Webshell对网站的危害以及预防措施。

在互联网中,会潜在各种各样对企业网站、数据信息、服务器等造成威胁的脚本、代码漏洞、木马、病毒等程序。最终给网络犯罪分子钻空子的机会,以此来获取利益。今天给大家简单的说下Webshell对网站的危害以及预防措施。也是第一次了解,有什么不…

多IP服务器或者三线服务器建站的优势有哪些?

多IP的站群服务器是一个站长通过采用一个服务器,利用多IP的形式可以同时运营多个网站的模式。一般情况下一台服务器会配有一个IP,当然一台服务器也是可以同时运营多个网站的。那么使用多IP服务器相对于单IP的服务器而言优势有哪些呢? 1、多…

搭建个人网站,服务器应该怎么选择。

新手怎么去挑选服务器的配置呢?目前不管是个人还是企业,只要是需要在网上开展业务的话,都需要有自己的网站或者应用程序。VPS因为性能较低使用不太方便,渐渐被淘汰出市场。那么在各类服务器的选项下,怎么选择适合的配置…

为什么接入了云防网站打开还是504

当出现504错误的时候,说明节点和源之间的通信出了问题,一般都是因为没有加白名单引起的,源IP要给节点IP加白名单,节点IP也要给源IP加白名单。而像阿里云ECS这种类型的,很多人以为这个是没墙的不用加白,其实…

网站搭建过程中,容易忽略哪些细节?

虽然现在基本上所有的企业都有自己的网站,但是网站的质量却是良莠不齐,很多企业的网站可能连打开都要很久,这样的网站就和没有差不多,甚至对企业的形象还会产生负面的影响,那么比较差的网站一般会出现哪些问题呢&#…

网站访问速度慢怎么办?--CDN加速

网站的访问速度慢,也许很多做过网站运营的站长都有过这种烦恼,那么我们是否有仔细的思考过,网站打开慢的原因是什么呢? 网站打开慢的因素是有很多的,下文将说说常见的导致网站速度过慢的原因: 使用的是低…

网站选用CDN加速的原因有哪些?

在网站的访问上,如果存在访问延时太久,打开一个网站总是要等待很久。大部分的用户就会觉得不耐烦,直接关闭网站,不愿意在继续等待。即使这个网站的内容有多吸引人,用户还是会选择放弃访问。为了保障网站能稳定高速的被…

网站被劫持了怎么办?

在网络上我们经常可以发现一个问题,当我们去点击访问一个网页查看内容时,会被跳转至一个我们完全没有点击的网站。这就是属于网络劫持的一种,一般劫持者会选择流量较高的小网站进行用户劫持,将访问A网页的用户,劫持到B…

什么是网站系统安全的渗透检测?

建设网站系统需要做的工作很多,比如架构,模板的确认,还有各个安全问题的考虑,比如漏洞,木马等问题的渗透测试。而对于渗透这个词很多人都没怎么接触过。相信最近追热播亲爱的,热爱的这部电视剧的小哥哥小姐…

网站站长遇到ddos攻击防护措施有哪些?

DDOS是属于各行各业比较常见的一种流量攻击类型了,找正规的IDC企业,基本都是可以提供DDOS攻击的防护产品的。那么在面对DDOS攻击时,往往可以做哪些防护措施呢? 图片水印Q 1、增加带宽进行硬抗 网络带宽直接决定了网站所能承受攻…

新手站长搭建网站如何选择一款合适自己的服务器或云服务器。

新手在建站时应该选择什么配置的服务器呢?在选择服务器配置时,为了不造成资源的浪费,不超预算。在选择云服务器配置时还是需要格外用心的。 图片水印Q 云服务器的配置主要包含有:CPU、内存、线路、带宽等,在选择配置时…

遇到CC攻击的症状是什么?网站站长,游戏GM必看

什么是CC攻击? CC主要是用来攻击页面的.大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,对不?!一般来说,访问的人越多,论坛的页…