为什么要用Message Queue
- 解耦
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束 - 冗余
有时在处理数据的时候处理过程会失败。除非数据被持久化,否则将永远丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在被许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理过程明确的指出该消息已经被处理完毕,确保你的数据被安全的保存直到你使用完毕。 - 扩展性
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的;只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。 - 灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住增长的访问压力,而不是因为超出负荷的请求而完全崩溃。 - 可恢复性
当体系的一部分组件失效,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。而这种允许重试或者延后处理请求的能力通常是造就一个略感不便的用户和一个沮丧透顶的用户之间的区别。 - 送达保证
消息队列提供的冗余机制保证了消息能被实际的处理,只要一个进程读取了该队列即可。在此基础上,IronMQ提供了一个”只送达一次”保证。无论有多少进程在从队列中领取数据,每一个消息只能被处理一次。这之所以成为可能,是因为获取一个消息只是”预定”了这个消息,暂时把它移出了队列。除非客户端明确的表示已经处理完了这个消息,否则这个消息会被放回队列中去,在一段可配置的时间之后可再次被处理。
- 顺序保证
在许多情况下,数据处理的顺序都很重要。消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。IronMO保证消息浆糊通过FIFO(先进先出)的顺序来处理,因此消息在队列中的位置就是从队列中检索他们的位置。 - 缓冲
在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行—写入队列的处理会尽可能的快速,而不受从队列读的预备处理的约束。该缓冲有助于控制和优化数据流经过系统的速度。 - 理解数据流
在一个分布式系统里,要得到一个关于用户操作会用多长时间及其原因的总体印象,是个巨大的挑战。消息系列通过消息被处理的频率,来方便的辅助确定那些表现不佳的处理过程或领域,这些地方的数据流都不够优化。 - 异步通信
很多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。
常用Message Queue对比
-
RabbitMQ
RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。 - Redis
Redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。 - ZeroMQ
ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景。ZMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演了这个服务角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。其中,Twitter的Storm中默认使用ZeroMQ作为数据流的传输。 - ActiveMQ
ActiveMQ是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。 - Kafka/Jafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。
Kafka简介
Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,并保证即使对TB级以上数据也能保证常数时间的访问性能
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输
- 支持Kafka Server间的消息分区,及分布式消息消费,同时保证每个partition内的消息顺序传输
- 同时支持离线数据处理和实时数据处理
引自:http://blog.csdn.net/allthesametome/article/details/47362451
相关推荐
消息队列简介 消息队列,作为信息技术领域中一种重要的工具,主要用于实现分布式系统中的异步服务间通信。它基于先进先出(FIFO)的数据结构——队列,允许应用程序将数据(即消息)放入队列,而其他应用程序可以从...
这些消息队列各有特点,例如RabbitMQ支持多种协议,Kafka擅长大数据流处理,而ZeroMQ则提供了轻量级的解决方案。 3. **消息模型**:消息队列通常采用两种模型,即点对点(Point-to-Point)和发布/订阅(Publish/...
消息队列是一种在分布式系统中用于解耦组件和实现异步通信的重要技术。它通过将消息存储在一个中间队列中,使得生产者可以发送消息而不必立即等待消费者的响应,消费者也可以在适合的时间处理这些消息,从而提高系统...
4. **消息通信:** 消息队列还可以作为不同系统之间进行通信的一种方式,特别是在微服务架构中,各服务之间通过消息队列进行数据交换,既安全又高效。 #### 三、消息队列的应用场景 1. **异步处理:** 如上所述,...
消息队列(Message Queue,MQ)是分布式系统中常见的组件,用于解耦应用程序的不同部分,提高系统的可扩展性和可靠性。本示例“简单的消息队列Dome”旨在为初学者提供一个易于理解的实践案例,帮助他们快速入门消息...
消息队列是一种在消息传输过程中保存消息的容器,它允许在两台计算机之间传送消息,这些消息可以很简单,比如只包含文本字符串,也可以很复杂,如包含嵌入对象。消息队列的作用主要是异步处理、提高系统性能、降低...
- 系统解耦:各组件通过消息队列通信,降低直接依赖。 - 批量处理:积压的任务可以先放入队列,后台处理,避免阻塞用户界面。 - 流量削峰:在高并发场景下,消息队列可以平滑系统负载,防止过载。 6. **学习与...
Linux IPC通信利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理。消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来...
分层架构通常包括表示层、业务逻辑层和数据访问层,消息队列可以在这些层之间作为通信桥梁,使得各层可以独立扩展和优化。例如,当用户发起一个请求时,应用可以将操作封装为消息并发送到队列,而不是立即执行。这样...
消息队列是现代大型电商项目中不可或缺的一部分,它在分布式架构中扮演着至关重要的角色,帮助处理项目间的异步通信和高并发问题。本项目"消息队列入门项目demo"旨在提供一个基础的实践环境,让你了解并掌握消息队列...
【Nginx集群之WCF分布式消息队列】 在IT领域,尤其是在服务器管理和分布式系统设计中,Nginx集群和WCF(Windows Communication Foundation)分布式消息队列是两个至关重要的概念。Nginx是一款高性能的HTTP和反向...
1. **解耦**:通过消息队列可以降低服务之间的耦合度,使得各个服务更加独立。 2. **异步处理**:将耗时的操作放入消息队列,由消费者异步处理,提高系统的响应速度。 3. **削峰填谷**:在高并发场景下,利用消息...
在本案例中,`handler.vsd`文件很可能是Visio绘制的UML类图,展示了消息队列模型的各个组件及其关系。通过类图,我们可以清晰地看到类之间的继承层次,方法签名,以及类之间的关联,这有助于我们理解代码的组织结构...
创建一个消息队列首先需要定义一个指针数组,然后把各个消息数据缓冲区的首地址放入这个数组中,然后调用 OSQCreate() 函数来创建消息队列。OSQCreate() 函数将从空闲事件控制块链表中取出一个事件控制块,然后在...
随着时间的推移,分布式技术和云计算的兴起,大型分布式应用开始转向使用这种技术,对传统消息队列提出了新的要求,包括在分布式架构中各组件间的解耦、降低开发和运维成本、方便实现不同数据中心和不同节点间的通信...
- **日志记录**:分布式系统中的日志收集可以通过JMS主题实现,各个服务节点发布日志消息,日志收集器订阅并处理这些消息,实现跨服务器的日志聚合。 **Apache ActiveMQ介绍** Apache ActiveMQ是流行的开源JMS...
### Unix环境下利用Socket和消息队列构建应用通信平台 在Unix环境下构建应用通信平台时,开发者需要关注如何确保数据流的准确与有效传输。通信平台的设计涵盖了进程内部通信、本地进程间通信以及网络间的远程通信等...
### Java中间件中的消息队列应用 #### 一、消息队列的主要应用场景 **1.1 解耦** 在传统的系统架构中,系统A通常需要直接调用系统B和系统C的功能,这种直接调用的方式使得各个系统之间的耦合度非常高。例如,如果...
消息队列可以存储有限数量的消息,当队列满时,发送消息的任务将被阻塞,直到有空间可用。同样,当队列为空时,尝试接收消息的任务也会被阻塞,直到有新的消息到达。 二、实验设计 实验中创建了两个不同属性的消息...
### Posix消息队列与System V消息队列详解 #### 概述 消息队列是一种进程间通信方式,主要用于在不同进程之间交换数据。通过消息队列,进程可以在不直接相互连接的情况下进行通信,这对于提高程序的灵活性和解耦...