消息队列01

 公司项目里面用到了这个rabbitmq,自己以前不熟悉,看了代码里面的应用,自己也准备试着搭建下。

 可以参照其他博主的这篇优秀博文: https://www.cnblogs.com/chengpeng15/p/5814197.html

 

 


一 前期需要了解的概念

1.什么是异步?什么是异步通信?

异步:客户端不需要等待服务器处理消息,甚至不需要等待消息投递完成。客户端发送消息,然后继续执行。(因为客户端假定了服务器最终可以收到并处理这条消息)

异步通信是指:有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把消息放入队列,但并不立即处理它。想在队列中放入多少消息就放多少,然后在需要的时候再去处理他。

 

2.为什么说异步中  间接性 是关键?

一个应用向另一个应用发送消息时,两个应用间没有间接的联系。而是发送方的应用程序会将消息交给一个服务器(也就是消息中间件), 由服务来将消息投递给接收方。

 

3.建立一个消息队列的服务器所有内部的通讯交互都通过消息队列进行分发与订阅

 

 

4.使用消息队列有以下的好处 

A. 解耦

消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

B. 冗余

有时在处理数据的时候处理过程会失败。除非数据被持久化,否则将永远丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在被许多消息队列所采用的“插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理过程明确的指出该消息已经被处理完毕,确保你的数据被安全的保存直到你使用完毕。

C. 扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的;只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。

D. 灵活性 & 峰值处理能力

在访问量剧增的情况下,你的应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住增长的访问压力,而不是因为超出负荷的请求而完全崩溃。

E. 可恢复性

当体系的一部分组件失效,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。而这种允许重试或者延后处理请求的能力通常是造就一个略感不便的用户和一个沮丧透顶的用户之间的区别。

F. 送达保证

消息队列提供的冗余机制保证了消息能被实际的处理,只要一个进程读取了该队列即可。无论有多少进程在从队列中领取数据,每一个消息只能被处理一次。这之所以成为可能,是因为获取一个消息只是"预定"了这个消息,暂时把它移出了队列。除非客户端明确的表示已经处理完了这个消息,否则这个消息会被放回队列中去,在一段可配置的时间之后可再次被处理。

G.排序保证

在许多情况下,数据处理的顺序都很重要。消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。消息浆糊通过FIFO(先进先出)的顺序来处理,因此消息在队列中的位置就是从队列中检索他们的位置。

H.缓冲

在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行--写入队列的处理会尽可能的快速,而不受从队列读的预备处理的约束。该缓冲有助于控制和优化数据流经过系统的速度。

I. 理解数据流

在一个分布式系统里,要得到一个关于用户操作会用多长时间及其原因的总体印象,是个巨大的挑战。消息系列通过消息被处理的频率,来方便的辅助确定那些表现不佳的处理过程或领域,这些地方的数据流都不够优化。

J. 异步通信

很多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。

 

 

2.MQ原理

2.1mq模型

  1. Pub/Sub发布订阅(广播):使用topic作为通信载体 

  2. PTP点对点:使用queue作为通信载体 

2.2 mq的组成

  • Broker:消息服务器,作为server提供消息核心服务

  • Producer:消息生产者,业务的发起方,负责生产消息传输给broker

  • Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理

  • Topic:主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播

  • Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收

  • Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

2.3 mq常用协议

  • AMQP 
    AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议, 
    是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并 
    不受客户端/中间件不同产品,不同开发语言等条件的限制。 
    优点:可靠、通用

  • MQTT协议 
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协 
    议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来, 
    被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。 
    优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统

  • STOMP协议 
    STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。 
    优点:命令模式(非topic\queue模式)

  • XMPP协议 
    XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。 
    优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大

  • 其他基于TCP/IP自定义的协议 
    有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。

2.4 MQ选型

    • RabbitMQ 
      使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。

    • ZeroMQ 
      又称ØMQ、0MQ、ZMQ,号称最快的消息队列系统,专门为高吞吐量、低延迟的场景开发,在金融界的应用中经常使用,偏重于实时数据通信场景。ZMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,开发成本高。因此ZeroMQ具有一个独特的非中间件的模式,更像一个socket library,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序本身就是使用ZeroMQ API完成逻辑服务的角色。但是ZeroMQ仅提供非持久性的队列,如果down机,数据将会丢失。如:Twitter的Storm中使用ZeroMQ作为数据流的传输。 ZeroMQ套接字是与传输层无关的:ZeroMQ套接字对所有传输层协议定义了统一的API接口。默认支持 进程内(inproc) ,进程间(IPC) ,多播 ,TCP协议,在不同的协议之间切换只要简单的改变连接字符串的前缀。可以在任何时候以最小的代价从进程间的本地通信切换到分布式下的TCP通信。ZeroMQ在背后处理连接建立,断开和重连逻辑。 
      特性:

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

      • 批量处理的算法 
        对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息。

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

    • ActiveMQ 
      Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

    • Redis 
      使用C语言开发的一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

    • Kafka 
      Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性: 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化; 
      高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率; 
      高堆积:支持topic下消费者较长时间离线,消息堆积量大; 
      完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡; 
      支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

 

 

 

 

 

 

 

 

 

--未完,待补充

转载于:https://www.cnblogs.com/PinkPink/p/9264007.html

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

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

相关文章

java instanceof翻译_Java 中的instanceof简单讲解

Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。用法:result object instanceof class参数:Result:布尔类型…

Spring4有条件

Spring 4引入了一个称为Conditional的新功能,该功能针对于生成bean的Spring组件,并注视这些bean的生成,实质上,它提供了一种条件生成bean的方法。 考虑一个简单的例子: 我有一个名为“ CustomerService”的服务&…

inline「一」:从 image 底部白边初识 line-height

本文首发于个人博客 http://www.lijundong.com/image-and-line-height/ 今天在做一个静态页面时,图片底部出现一条 3px 高度的白边,既不是 margin 也不是 padding,找了好久没能解决,后来才发现与 line-height 相关,问…

(转) STM32--ADC

原标题:STM32之ADC步骤小技巧(英文) 看到标题,别吓到哈、并不是要用英文写、至于原因是什么、请往下看: 言归正传:STM32的ADC模块的特色 1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、…

java resultset 映射到实例_[Java]ResultSet的用法与实例

JDBC API 2.0/3.0中ResultSet记录集的简便实用的新特性1 新定义了若干个常数这些常数用于指定ResultSet 的类型游标移动的方向等性质,如下所示:public static final int FETCH_FORWARD; 该常数的作用是指定处理记录集中行的顺序,是由前到后即…

嗨,那里有回调!

因为是我的书包,所以我喜欢JavaScript 。 实际上,我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此,当我发现自己处于非JavaScript环境中时(例如Java) ,我往往会错过使用回调的机会。 好消息是…

python2.x 文件读写

打开文件 f open(filename,type) # filename 是文件所在路径# type 为文件打开的方式,也是字符串 读取单行 oneLineStr f.readline() 读取所有,一行一行读取 allInLines f.readlines() 读取所有,返回一个字符串 all f.read() 去除字符串开…

synchronized 修饰在 static方法和非static方法的区别

Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到…

Flexible 弹性盒子模型之CSS justify-content 属性

实例 在弹性盒对象的 <div> 元素中的各项周围留有空白&#xff1a; div{display: flex;justify-content: space-around;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一…

java标识符可以$开头吗_JAVA标识符

JAVA标识符JAVA标识符简介Java语言中&#xff0c;对于变量&#xff0c;常量&#xff0c;函数&#xff0c;语句块也有名字&#xff0c;我们统统称之为Java标识符。也就是程序员在定义java程序时&#xff0c;自定义的一些名字&#xff0c;例如helloworld 程序里关键字class后跟的…

GC内存可视化器教程–第一部分

正如您从以前的文章中可能已经读到的那样&#xff0c;要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力&#xff0c;例如Java堆内存占用量以及垃圾回收过程。 为了实现上述目标&#xff0c;所有JVM供应商&#xff08;Oracle&#xff0c;IBM等&#xff09;都…

设置表格边框颜色

1、源码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>设置表格边框颜色</title><meta http-equiv"keywords" content"keyword1,keyword2,keyword3"…

图片热点

图片热点&#xff1a; 规划出图片上的一个区域&#xff0c;可以做出超链接&#xff0c;直接点击图片区域就可以完成跳转的效果 网页划区&#xff1a; 在一个网页里&#xff0c;规划出一个区域用来展示另一个网页的内容。 网页的拼接&#xff1a; 在一个网络页面内&#xff0c;规…

java se程序设计_JavaSE--Java 的基本程序设计结构

Java 对大小写敏感Java 中定义类名的规则很宽松。名字必须以字母开头&#xff0c;后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用 Java 保留字作为类名。标准的命名规范为&#xff1a;类名是以大写字母开头的名词。如果名字由多个单词组成&#xff0c;每个…

Python开发【第十九篇】:Python操作MySQL

本篇对于Python操作MySQL主要使用两种方式&#xff1a; 原生模块 pymsqlORM框架 SQLAchemypymsql pymsql是Python中操作MySQL的模块&#xff0c;其使用方法和MySQLdb几乎相同。 下载安装 1pip3 install pymysql使用操作 1、执行SQL 123456789101112131415161718192021222324252…

Javaone 2013评论

tl; dr我今年再次参加了Javaone。 好玩。 星期日 会议于周日开幕&#xff0c;进行了用户组会议和主要主题演讲。 实际上&#xff0c;由于我正在运行有关Java SE 7和8中新功能的Java大学培训课程&#xff0c;所以我实际上无法参加这些课程。该课程涵盖了Java 7的项目硬币&#…

20180705 考试记录

T1 货物运输弱化版 题解&#xff1a; 倒着跑最短路就行没仔细看题凉凉 code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define F(i,a,b) for(register int i(a);i<(b);i) using namespace std;int rd() {int x…

mysql集群跨地域同步部署_跨地域冗余 - 跨数据中心部署方案 - 《TiDB v2.1 用户文档》 - 书栈网 · BookStack...

跨数据中心部署方案作为 NewSQL 数据库&#xff0c;TiDB 兼顾了传统关系型数据库的优秀特性以及 NoSQL 数据库可扩展性&#xff0c;以及跨数据中心(下文简称“中心”)场景下的高可用。本文档旨在介绍跨数据中心部署的不同解决方案。三中心部署方案TiDB, TiKV, PD 分别分布在 3 …

Flexible 弹性盒子模型之CSS align-items 属性

实例 居中对齐弹性盒的各项 <div> 元素&#xff1a; div{display: flex;align-items:center;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 align-i…

使用Maven进行硒测试自动化

今天&#xff0c;我想帮助您更好地管理自动GUI测试&#xff08;Selenium&#xff09;。 在过去&#xff0c;我已经看到人们处理此问题的许多不同方式。 有些人只是使用Selenium-IDE编写这些普通HTML TestCases&#xff0c;将其存储在HDD上的某个位置&#xff0c;并在需要时手动…