消息队列

RabbitMQ学习之:(三)AMQP和RabbitMQ介绍

丶灬走出姿态 提交于 2019-12-07 15:28:21
准备开始 高级消息队列协议(AMQP 1 )是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS 2 ),AMQP客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器 3 和客户端可以投入使用 4 。 AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。 本文中区别发布/订阅是为了将生产者和消费者拆分开来: 生产者无需知道消费者按照什么标准接受消息 。队列是一个先入先出的数据结构。路由封装了消息队列中的消息的相关信息,这些信息决定了消息在异步消息系统中的最终展现形式。 在这里,我尝试解释一下这个模型的一些概念,Aman Gupta使用Ruby 5 实现了AMQP模型 6 。它使用的是一种事件驱动架构(基于EventMachine 7 ),在阅读和使用的时候都会让人觉得有些不太熟悉

Kafka——生产者发送原理分析

寵の児 提交于 2019-12-07 14:52:26
目录 整体架构 整体架构 整个生产过程由两个线程协调运行,分别为主线程和sender线程(发送线程)。在主线程中,由KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后,缓存消息到消息加载器(RecordAccumulator,也称为消息收集其)中,Sender线程负责从RecordAccumulator中获取消息并将其发送到Kafka中。 RecordAccumulator主要用来缓存消息以便Sender线程可以批量发送,进而减少网络传输的资源消耗以提升性能。RecordAccumulator缓存的大小可以通过生产者参数buffer.memory配置,默认值为33444432b,即32mb。如果生产者发送消息的速度大于发送到服务器的速度,也就是RecordAccumulator缓存不够,此时kafkaproducer的send方法调用要被被阻塞,要么抛出异常,这个取决于参数max.block.ms参数,此参数的默认值为60000ms,60s。 主线程发送过来的消息会被追加到RecordAccumulator的某个双端队列中,在RecordAccumulator内部为每个分区都维护了一个双端队列,队列中的内容就是ProducerBatch,即Deque 。消息写入缓存时,追加到双端队列的尾部,sender读取消息的时候,从双端队列的头部读取。注意

Qt应用Redis实现消息队列

*爱你&永不变心* 提交于 2019-12-07 12:17:06
类似BS模式,客户端发送任务请求给服务端,服务端将处理结果返回给客户端。 redis负责消息的存储和转发。 仿真病人挂号看病,Patient进程进行挂号,Doctor进程进行看病 ,程序代码如下: //////////////////////////////////////////// Patient //////////////////////////////////////////// Patient.h: #include <QObject> class QRedis; class Patient : public QObject { Q_OBJECT public: Patient(QObject *parent = nullptr); ~Patient(); public slots: void pushTask(); //push任务 private: void popResult(); //pop结果 QRedis * m_redis; }; Patient.cpp #include "patient.h" #include "qredis.h" #include <QTimer> #include <QEventLoop> #include <QThread> static const QString KEYTASK = "MARKTASK"; static

使用Redis实现异步消息队列

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 12:15:28
前言 在后端编程时,对需要立即返回的数据我们应当立刻返回,而对于可以慢慢处理而业务复杂的我们可以选择延迟返回。这个实现使用到了异步消息队列。 异步消息队列 主要用于实现生产者-消费者模式。也就是说,这个队列应当是可以阻塞的,否者会带来大量的性能浪费。 生产者-消费者模式 更加 详细的介绍我找到了一篇博客,讲得挺好的,我就不详细说了。 生产者消费者模式-Java实现 实现 1.定义事件类型 -- 定义Enum类 -- EnumType 用于表示该事件的类型 public enum EventType { //这里列举了四种类型 LIKE(0), COMMENT(1), LOGIN(2), MAIL(3); private int value; EventType(int value) { this.value = value; } public int getValue() { return value; } } 2.定义事件的实体 -- EventModel 这里说明一下entityOwnerId的必要性。举个例子,当我们给一个人点赞时,系统要给那个人(也就是entityOwnerId)发送一个站内信,通知那个人他被点赞了。当然,我们也可以把entityOwnerId包装在exts里,但因为几乎每一个事件都需要这个字段,所以这里我们开一个字段给他。 public class

Android消息机制1-Handler(Java层)

橙三吉。 提交于 2019-12-07 12:10:25
相关源码 framework/base/core/java/andorid/os/Handler.java framework/base/core/java/andorid/os/Looper.java framework/base/core/java/andorid/os/Message.java framework/base/core/java/andorid/os/MessageQueue.java libcore/luni/src/main/java/java/lang/ThreadLocal.java 一、概述 在整个Android的源码世界里,有两大利剑,其一是Binder IPC机制,,另一个便是消息机制(由Handler/Looper/MessageQueue等构成的)。关于Binder在 Binder系列 中详细讲解过,有兴趣看看。 Android有大量的消息驱动方式来进行交互,比如Android的四剑客 Activity , Service , Broadcast , ContentProvider 的启动过程的交互,都离不开消息机制,Android某种意义上也可以说成是一个以消息驱动的系统。消息机制涉及MessageQueue/Message/Looper/Handler这4个类。 1.1 模型 消息机制主要包含: Message:消息分为硬件产生的消息

Spring Cloud Config + Spring Cloud Bus + kafka实现配置中心配置动态更新

喜你入骨 提交于 2019-12-07 12:00:10
一、架构图 当在 Git 仓库中某个应用配置文件中的参数更新后,只需要通过 POST方法访问 config Server 的 /actuator/bus-refresh 接口,就可以让所以的微服务节点更新配置。 在我们的 DEMO 中有一个 Config Server 和 两个 Config Client。另外还有两个配置中心节点。配置中心节点的部署请查看 Spring Cloud Eureka 部署高可用注册中心 。 二、下载和部署 kafka 到 kafka 官网下载 kafka 2.12-2 解压到 E:\软件3\JAVA\消息中间件。 cd E:\软件3\JAVA\消息中间件\kafka_2.12-2.0.0 -- 启动 bin\windows\zookeeper-server-start.bat config\zookeeper.properties -- 启动 kaffka bin\windows\kafka-server-start.bat config/server.properties -- 创建 Topic (可理解为创建消息队列) bin\windows\kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test --

spring kafka 配置详解

假装没事ソ 提交于 2019-12-07 11:59:56
[b]spring kafka 配置详解[/b] 使用spring-integration-kafka发送消息 1.Outbound Channel Adapter用来发送消息到Kafka。 2.消息从Spring Integration Channel中发出,一旦配置好这个Channel,就可以利用这个Channel往Kafka发消息。(MessageChannel类)。 1.int:channel是配置Spring Integration Channel, 此channel基于queue。 2.int-kafka:outbound-channel-adapter是outbound-channel-adapter对象, 内部使用一个线程池处理消息。关键是kafka-producer-context-ref。 3.int-kafka:producer-context配置producer列表,要处理的topic,这些Producer最终要转换成Kafka的Producer。 4.task:executor任务队列的配置: [b]BROKER 的全局配置[/b] ------------------------------------------- 系统 相关 ------------------------------------------- #

spring集成kafka配置

↘锁芯ラ 提交于 2019-12-07 11:57:26
一 所需jar包 <!--spring相关包--> < dependency > < groupId > org.springframework </ groupId > < artifactId > spring-web </ artifactId > < version > 4.2.5.RELEASE </ version > </ dependency > < dependency > < groupId > org.springframework </ groupId > < artifactId > spring-webmvc </ artifactId > < version > 4.2.5.RELEASE </ version > </ dependency > <!-- 添加Spring-core包 --> < dependency > < groupId > org.springframework </ groupId > < artifactId > spring-core </ artifactId > < version > 4.2.5.RELEASE </ version > </ dependency > <!-- 添加spring-context包 --> < dependency > < groupId > org.springframework <

RabbitMQ之消息模式2

≡放荡痞女 提交于 2019-12-07 11:54:28
消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们 单个客户端无法同时处理这么多数据 ! 消费端限流RabbitMQ 提供的解决方案 RabbitMQ提供了一种qos(服务质量保证)功能,即在 非自动确认消息 的前提下,如果一定数目的消息(通过基于Consumer或者Channel设置Qos的值)未被确认前,不进行消费新的消息 Void BasicQos(uint prefetchSize, ushort prefetchCount, bool global); prefetchSize:0 不限制消息大小 prefetchSize:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该Consumer将block(阻塞)掉,直到有消息ack Global:true\false是否将上面设置应用于Channel;简单来说,就是上面限制是Channel级别的还是Consumer级别 注意: prefetchSize 和global 这两项,RabbitMQ 没有实现,暂且不研究; prefetch_count 在no_ask=false 的情况下生效,即在自动应答的情况下,这两个值是不生效的; 自定义消费端代码

RabbitMQ消息模式02

…衆ロ難τιáo~ 提交于 2019-12-07 11:36:27
消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么多数据! 消费端限流RabbitMQ 提供的解决方案 RabbitMQ提供了一种qos(服务质量保证)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于Consumer或者Channel设置Qos的值)未被确认前,不进行消费新的消息 Void BasicQos(uint prefetchSize, ushort prefetchCount, bool global); prefetchSize:0 不限制消息大小 prefetchSize:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该Consumer将block(阻塞)掉,直到有消息ack Global:true\false是否将上面设置应用于Channel;简单来说,就是上面限制是Channel级别的还是Consumer级别 注意: prefetchSize 和global 这两项,RabbitMQ 没有实现,暂且不研究; prefetch_count 在no_ask=false 的情况下生效,即在自动应答的情况下,这两个值是不生效的; 自定义消费端代码