消息队列

Kafka学习-简介

余生长醉 提交于 2020-03-05 09:47:58
   Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。 Kafka创建背景   Kafka是一个消息系统,原本开发自LinkedIn,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础。现在它已被作为多种类型的数据管道和消息系统使用。 活动流数据是几乎所有站点在对其网站使用情况做报表时都要用到的数据中最常规的部分。活动数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性地对这些文件进行统计分析。运营数据指的是服务器的性能数据(CPU、IO使用率、请求时间、服务日志等等数据)。 kafka作为一个集群运行在一个或多个服务器上, kafka集群存储的消息是以topic为类别记录的, 每个消息(也叫记录record,我习惯叫消息)是由一个key,一个value和时间戳构成。 核心组件 Producer :发布消息到1个或多个topic(主题)。 Comsumer :来订阅一个或多个topic,并处理产生的消息。 Streams :充当一个流处理器

Rabbitmq基本原理

早过忘川 提交于 2020-03-05 06:23:42
MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息。RabbitMQ是MQ产品的典型代表,是一款基于AMQP协议可复用的企业消息系统。业务上,可以实现服务提供者和消费者之间的数据解耦,提供高可用性的消息传输机制,在实际生产中应用相当广泛。本文意在介绍Rabbitmq的基本原理,包括rabbitmq基本框架,概念,通信过程等。 系统架构 Rabbitmq系统最核心的组件是Exchange和Queue,下图是系统简单的示意图。Exchange和Queue是在rabbitmq server(又叫做broker)端,producer和consumer在应用端。 producer&Consumer producer指的是消息生产者,consumer消息的消费者。 Queue 消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失 设置为临时队列,queue中的数据在系统重启之后就会丢失 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

【译】RabbitMQ:工作队列(Work Queue)

独自空忆成欢 提交于 2020-03-05 03:34:36
在第一篇我们写了两个程序通过一个命名的队列分别发送和接收消息。在这一篇,我们将创建一个工作队列在多个工作线程间分发耗时的工作任务。 工作队列的核心思想是避免立刻处理资源密集型任务导致必须等待其执行完成。相反的,我们安排这些任务在稍晚的时间完成。我们将一个任务封装为一个消息并把它发送到队列中。一个后台的工作线程将从队列中取出任务并最终执行。当你运行多个工作线程,这些任务将在这些工作线程间共享。 这个概念对于在一个 HTTP 请求中处理复杂任务的 Web 应用尤其有用。 准备工作 在前一篇中,我们发送了一条内容为“ Hello World !”的消息。现在,我们将要发送一些代表复杂任务的字符串。我们并没有诸如改变图片大小或者渲染 PDF 文件这样的真实的任务,所以假设任务会导致系统的繁忙 -- 通过使用 Threed.Sleep() 函数。我们会采用许多的点( . )在字符串中来表达他的复杂性,每一个点将消耗一秒钟的工作时间。例如,假设有一个任务“ Hello... ”将消耗 3 秒钟。 我们会把上一个例子中的 Send.cs 文件中的代码稍微调整一下,使得对任意的消息都能通过命令行发送。这个程序将调度任务到我们的工作队列中,所以让我们将它命名为 NewTask.cs: 1 var message = GetMessage(args); 2 var body = Encoding

RabbitMQ教程C#版 - 工作队列

僤鯓⒐⒋嵵緔 提交于 2020-03-05 03:33:40
先决条件 本教程假定 RabbitMQ 已经安装,并运行在 localhost 标准端口(5672)。如果你使用不同的主机、端口或证书,则需要调整连接设置。 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以通过邮件列表 联系我们 。 工作队列 # (使用 .NET Client) 在 教程[1] 中,我们编写了两个程序,用于从一个指定的队列发送和接收消息。在本文中,我们将创建一个 工作队列 ,用于在多个工作线程间分发耗时的任务。 工作队列(又名:任务队列)背后的主要想法是避免立即执行资源密集型、且必须等待其完成的任务。相反的,我们把这些任务安排在稍后完成。我们可以将任务封装为消息并把它发送到队列中,在后台运行的工作进程将从队列中取出任务并最终执行。当您运行多个工作线程,这些任务将在这些工作线程之间共享。 这个概念在Web应用程序中特别有用,因为在一个 HTTP 请求窗口中无法处理复杂的任务。 准备 # 我们将略微修改上一个示例中的 Send 程序,以其可以在命令行发送任意消息。 这个程序将调度任务到我们的工作队列中,所以让我们把它命名为 NewTask : 像 教程[1] 一样,我们需要生成两个项目: Copy dotnet new console --name NewTask mv NewTask/Program.cs NewTask/NewTask.cs dotnet new

[译]RabbitMQ教程C#版 - 工作队列

本秂侑毒 提交于 2020-03-05 03:31:20
原文: [译]RabbitMQ教程C#版 - 工作队列 先决条件 本教程假定 RabbitMQ 已经安装,并运行在 localhost 标准端口(5672)。如果你使用不同的主机、端口或证书,则需要调整连接设置。 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以通过邮件列表 联系我们 。 工作队列 (使用 .NET Client) 在 教程[1] 中,我们编写了两个程序,用于从一个指定的队列发送和接收消息。在本文中,我们将创建一个 工作队列 ,用于在多个工作线程间分发耗时的任务。 工作队列(又名:任务队列)背后的主要想法是避免立即执行资源密集型、且必须等待其完成的任务。相反的,我们把这些任务安排在稍后完成。我们可以将任务封装为消息并把它发送到队列中,在后台运行的工作进程将从队列中取出任务并最终执行。当您运行多个工作线程,这些任务将在这些工作线程之间共享。 这个概念在Web应用程序中特别有用,因为在一个 HTTP 请求窗口中无法处理复杂的任务。 准备 我们将略微修改上一个示例中的 Send 程序,以其可以在命令行发送任意消息。 这个程序将调度任务到我们的工作队列中,所以让我们把它命名为 NewTask : 像 教程[1] 一样,我们需要生成两个项目: dotnet new console --name NewTask mv NewTask/Program.cs NewTask

RabbitMQのdirect方式实现

前提是你 提交于 2020-03-05 03:25:52
在pom.xml中增加依赖 <!-- rabbitMQ的依赖。rabbitmq已经被spring-boot做了整合访问实现。 spring cloud也对springboot做了整合逻辑。所以rabbitmq的依赖可以在spring cloud中直接使用。 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 配置文件,配置mq的连接信息,交换器名称,路由键 spring.application.name=direct-producer server.port=8082 # 必要配置 # 配置rabbitmq链接相关信息。key都是固定的。是springboot要求的。 # rabbitmq安装位置 spring.rabbitmq.host=127.0.0.1 # rabbitmq的端口 spring.rabbitmq.port=5672 # rabbitmq的用户名 spring.rabbitmq.username=guest # rabbitmq的用户密码 spring.rabbitmq.password=guest # 可选配置 #

RabbitMQ学习总结(3)——入门实例教程详解

落花浮王杯 提交于 2020-03-05 01:09:39
一、起航 本章节,柯南君将从几个层面,用官网例子讲解一下RabbitMQ的实操经典程序案例,让大家重新回到经典“Hello world!”(The simplest thing that does something )时代,RabbitMQ 支持N多种客户端(client),这里无法一一讲解,暂定java client,有时间的情况下,在弥补一下。 事先,先普及一下图标(我们会在下面的事例中,会大量用到,所以先普及一下,便于识别,最终更好理解事例的含义) 1、图标概念 ① producting(生产者):在程序中 发送消息的一端,我们暂且称之为 生产者,在这里用“p”表示 ② queue(队列):队列是一个邮箱的名字。它住在RabbitMQ。尽管消息流经RabbitMQ和您的应用程序,他们只可以存储在一个队列中。队列是不受任何限制,它可以储存尽可能多的信息(按你兴趣来了),它本质上是一个无限缓冲区。许多生产商可以发送消息到一个队列,许多消费者可以尝试接收数据从一个队列。 ③ consuming(消费者):消费者和生产者是对应的,较为相似的意思;在这里,我用“C”表示 2、The Java client library RabbitMQ 中 AMQP这是一个开放的、通用的协议消息。有许多客户AMQP在许多不同的语言。我们将使用提供的Java客户机RabbitMQ。 我们需要下载

RabbitMQ消息队列之Windows下安装和部署(一)

被刻印的时光 ゝ 提交于 2020-03-04 20:47:26
参考文档: https://jingyan.baidu.com/article/ed15cb1bb5c3411be369819d.html https://blog.csdn.net/hzw19920329/article/details/53156015 https://blog.csdn.net/yemaiqingxiang/article/details/81019611 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erlang语言环境的搭建,其实是非常简单的。 登录Erlang官网,进入下载页,然后按照自己的系统环境来选择需要下载的安装文件,如下图所示: https://www.erlang.org/downloads 下载成功之后是个如下所示的安装程序:我的系统是x64位 然后开始安装(一路下一步就OK了) 接下来我们需要对Erlang语言的环境变量的配置,打开 系统属性-->高级-->环境变量 创建一个名为 ERLANG_HOME 的环境变量,其值指向erlang的安装目录,同时将 %ERLANG_HOME%\bin 加入到Path中 注:新建的是用户变量、编辑的是系统变量Path 最后打开命令行,输入erl,如果出现erlang的版本信息就表示erlang语言环境安装成功 好,到这里一定要重启计算机,如果不重启

Springboot + RabbitMQ实现消息延迟重试

*爱你&永不变心* 提交于 2020-03-04 18:39:14
一:简介 使用场景:调用第三方接口时如果调用失败需要隔几秒再去尝试下一次调用,直到调用N次还失败就停止调用。最常用的场景就是支付成功异步通知第三方支付成功。 1. 为什么要调用多次? 如果调用1次就成功了就停止调用,如果失败可能由于网络原因没有请求到服务器需要再次尝试,第二次很可能就会调用成功了。 2. 为什么要间隔几秒再尝试下次调用? 如果是因为网络原因没有请求到服务器如果再立刻调用,很可能此时网络还是没有好,可能等几秒后网络就恢复了,此时再去调用就好了。 实现效果类似于支付宝中的回调延迟重试: 二:代码示例 功能示例:每隔2秒、4秒、8秒、16秒去重试调用接口,总共调用4次。 pom.xml < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-amqp </ artifactId > </ dependency > < dependency > < groupId > org.apache.httpcomponents </ groupId > < artifactId > httpclient </ artifactId > < version > 4.5.6 </ version > </ dependency > <

Android handler机制流程详解

六眼飞鱼酱① 提交于 2020-03-04 06:39:53
Android handler机制流程详解 handler机制由以下几部分组成: .Handler .Message .MessageQueue .Looper 总体流程介绍: 一、进程启动时 在main方法中为主线程创建了对应自己线程的Looper,在Looper被创建的同时会创建一个MessageQueue消息队列并持有。同时在main方法中调用了Looper.loop()进行一个死循环遍历Looper自己持有的消息队列。 二、创建handler 如果在主线程中创建,handler能获取到主线程对应的looper并持有。如果是在子线程中创建handler,则需要自己调用创建looper方法和自己调用Looper.loop。否则会报错。 三、创建Message并发送 创建的Message将创建自己的handler信息封装进Message内部,最终被发送到了MessageQueue消息队列中。 四、接收消息 在Looper.loop中,从MessageQueue中拿出Message,并根据其中对应的handler信息进行分发处理 对应关系: 一条线程Thread对应唯一的一个Looper,其对应相关的信息存储在ThreadLocal中。 一个Looper对象持有一个自己的MessageQueue。 在同一条线程中,无论创建多少handler