消息队列

再看Handler消息传递机制原理

江枫思渺然 提交于 2020-01-22 08:12:56
关于handler实现原理的几个问题 源码分析 1.消息队列的数据结构和实现方式; 2.如何保持线程状态,不被销毁; 3.Message如何优先执行以及确保线程安全; 4.如何直接在主线程中执行 5.关于队列,我常用的实现方式 以下将根据源码来具体谈谈这几个问题,源码使用SDK 28。 实现原理主要包含下面几个类: MessageQueue :消息队列,在构造方法里初始化Native,持有队列第一个Message,循环遍历队列,队列为 空时阻塞线程。 Handler :发送和处理Message类,包含同步和异步、异步阻塞等结果,获取Message(通过 Message.obtain复用Message) Message :消息的实体类,包含下一个Message,并有一个静态的Message复用池,还有一些初始化参数等。 Looper :为当前线程创建MessageQueue,并遍历消息队列。 先说一下流程: 1 .Looper.prepare()为当前线程创建MessageQueue,Looper.loop()调用MessageQueue.next()方法遍历消息队列 (注:队列为空时next()方法会阻塞); 2 .Handler.sendMessage()方法调用MessageQueue.enqueueMessage()方法按照时间顺序向消息队列里面添加Message

Kafka-Consumer

大兔子大兔子 提交于 2020-01-21 23:28:21
kafka-consumer 参数配置 以及默认值 参数配置以及默认值 Consumer 一些概念 消费者 Consumer kafka 消费者,消费kafka队列里的消息,可以有多种语言实现, python java scala Go …, consumer group 即是由多个独立消费者组成,消费 Topic 下的消息, 独立消费者 standalong consumer 执行独立的消费。 消费者组 Consuemer group Kafka消费者是 消费组 的一部分,当多个消费者形成一个消费组来消费 主题 时,每个消费者会收到不同 分区 的消息。 consumer group 可能有若干个 consumer 实例 对于同一个 group 而言, topic 的每一条消息只能被发送到该 group 下的一个 consumer 实例上 topic 消息可以发送到 订阅该 topic 的 多个 group kafkaConsuemr 是非线程安全的,与 kafkaProducer 是不同的。 所以无法在多线程中使用同一个 kafkaConsuemr 进行消费。 每个线程维护一个 kafkaonsumer 用户创建多线程消费kafka分区数据, 每个线程中创建一个单独的 kafkaConsumer 实例。 为什么要使用 Consumer Group ? consumer Group

VM安装centos7

∥☆過路亽.° 提交于 2020-01-21 15:04:41
RabbitMQ:   RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。          注意:关于centos上安装rabbitmq会有很大问题,大家可以参考我这篇博客,已经可以正常访问。(网上有很多安装都是有问题的,大家可以自己试一下) RabbitMQ安装步骤:   准备工作:     1> vm安装centos: VM安装centos7     2>安装ifconfig,lrzsz,更新yum源等操作。参考: https://www.cnblogs.com/huhongy/p/7766107.html   1> 由于rabbitMQ安装的依赖于erlang,所以需要先进行安装前提环境:     yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto   2> 下载epel-release:     在官网上下载 epel-release 网址http://rpm.pbone.net/index.php3/stat/4/idpl/29069710/dir

消息队列介绍

怎甘沉沦 提交于 2020-01-21 14:25:42
1、 消息队列应用场景 异步处理、应用解耦、流量削峰、日志收集、事务最终一致性等 服务雪崩: 一个基础服务不可用,导致整个系统不可用。 流量削峰:将短时间的流量持久化,然后逐步处理 事务最终一致性: 处理分布式事务的规范: XA XA主要定义了全局事务管理器和局部事务管理器之间的接口;但是XA性能不高。 如何保证分布式事务的一致性呢? 引入事件表 2、消息队列功能支持 消息发送、接收和暂存 解决消息堆积、消息持久化、可靠投递、消息重复、严格有序、集群等问题 严格有序: 创建订单、支付完成、已发货、已收货、订单完成等环节; 需按照顺序消费消息, 否则就不对; 来源: CSDN 作者: jupiter_888 链接: https://blog.csdn.net/jupiter_888/article/details/104060292

一文搞定,RabbitMQ 从初识到精通

时间秒杀一切 提交于 2020-01-21 00:23:19
MQ消息中间件,这几年逐渐火爆起来,用处越来越多, 消息、削峰限流等 。MQ一般遵循AMQP协议。AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 当前市面上常见的MQ有,ActiveMQ、RabbitMQ、Kafka、RocketMQ等。她们中有标准的MQ(遵循AMQP协议,如RabbitMQ),也有非标准的MQ(如Kafka)。 一、RabbitMQ 简介 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ有如下特点, 可靠性 (Reliability),RabbitMQ 使用一些机制来保证可靠性,如 持久化、传输确认、发布确认 。 灵活的路由 (Flexible Routing),在消息进入队列之前,通过 Exchange 来路由消息的。 消息集群 (Clustering),多个

进程,线程通信与同步

谁都会走 提交于 2020-01-21 00:04:48
原文链接 1.0 Linux进程间通讯 管道/FIFO:管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式 消息队列:消息队列是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据. 需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!! 信号量:信号量,它与WINDOWS下的信号量是一样的,所以就不用多说了 共享内存:共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写 信号:signal 套接字socket IPC比较 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 4.信号量:不能传递复杂消息,只能用来同步 5.共享内存

RabbitMQ的工作队列

ⅰ亾dé卋堺 提交于 2020-01-20 20:47:31
在第一篇文章中,我们了解了什么是RabbitMQ、如何安装RabbitMQ,并利用RabbitMQ编写了一个简单的消息发送和接口的示例。 接下来,在本文中,我们将会创建一个工作队列 ,用于在多个Worker之间分配任务。 循环调度 工作队列的主要思想是避免立即执行资源密集型任务,且任务完成后才返回请求信息。 相反,我们接收到一个任务后并不立即处理,返回信息已收到,并后续排队依次进行处理。 此时,我们可以将任务封装为消息并将其发送到队列。 在后台运行的工作进程将会接收到消息并最终执行该任务。 当存在许多工作节点时,这些任务将在他们之间分配调度。 在本文的介绍中,我们将会发送一些表示复杂任务的消息。 在消息产生中,我们发送一些带有”.”的字符串,其中,每一个”.”表示等待1s。 例如,hello…则表示等待3s钟。 下面,我们来编写一个消息产生的文件 new_task.py : 来源: CSDN 作者: eddieHoo 链接: https://blog.csdn.net/u011323949/article/details/104055089

RabbitMq笔记

六眼飞鱼酱① 提交于 2020-01-20 20:39:04
应用场景 RabbitMQ,或者说AMQP解决了什么问题,或者说它的应用场景是什么? 对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability);如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如: 1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失? 2)如何降低发送者和接收者的耦合度? 3)如何让Priority高的接收者先接到数据? 4)如何做到load balance?有效均衡接收者的负载? 5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,如何做有效的filter。 6)如何做到可扩展,甚至将这个通信模块发到cluster上? 7)如何保证接收者接收到了完整,正确的数据? AMDQ协议解决了以上的问题,而RabbitMQ实现了AMQP。 系统架构 成为系统架构可能不太合适,可能叫应用场景的系统架构更合适。 RabbitMQ Server : 也叫broker server,它不是运送食物的卡车,而是一种传输服务。原话是

rabbitmq讲解

青春壹個敷衍的年華 提交于 2020-01-20 18:23:03
五种消息模型 RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。 simple简单模式 work工作模式(资源的竞争) 一个生产者,多个消费者,每个消费者获取到的消息唯一 publish/subscribe发布订阅(共享资源) 一个生产者发送的消息会被多个消费者获取。 routing路由模式 发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key topic 主题模式(路由模式的一种) 将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。 我们通过代码工程来了解RabbitMQ的工作方式: 依赖: < properties > < java.version > 1.8 </ java.version > < maven.compiler.source > ${java.version} </ maven.compiler.source > < project.build.sourceEncoding > UTF-8 </ project.build.sourceEncoding > < maven.compiler.target > ${java.version} </ maven.compiler.target > </ properties >

【整理】消息队列-ActiveMQ(一)

99封情书 提交于 2020-01-20 16:24:53
ActiveMQ简介 ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。 数据传送流程 PS:消息协商器(Message Broker),在一个连接中,客户端声明了一个通道,通过单一连接到协商器的并发控制需要建立一个可靠的模型,这里可以使用通道池和串行访问或者例如线程本地通道这样的线程并发模型。 通俗来讲就是指该MQ的服务端。 两种消息传递类型 1)点对点传输,即一个生产者对应一个消费者,生产者向broke推送数据,数据存储在broke的一个队列中,当消费者接受该条队列里的数据。 2)基于发布/订阅模式的传输,即根据订阅话题来接收相应数据,一个生产者可向多个消费者推送数据,与MQTT协议的实现是类似的。 两种消息传递类型的不同,点对点传输消费者可以接收到在连接之前生产者所推送的数据,而基于发布/订阅模式的传输方式消费者只能接收到连接之后生产者推送的数据。 MQTT协议 MQTT的全称是“ Message Queuing Telemetry Transport”,即消息队列遥测传输,是一种基于 订阅/发布模式 的应用层协议,而http是一种基于 restful风格 的一种应用层协议。 MQTT协议是一种轻量级协议,作为一种低开销