消息队列

分布式之消息队列

旧巷老猫 提交于 2020-01-16 10:58:21
1、为什么要使用消息队列? 主要有三个原因: 解耦、异步、削峰 (1)解耦 传统模式: 传统模式的 缺点 : 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦! 中间件模式: 中间件模式的的 优点 : 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。 (2)异步 传统模式: 传统模式的 缺点 : 一些非必要的业务逻辑以同步的方式运行,太耗费时间。 中间件模式: 中间件模式的的 优点 : 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度 (3)削峰 传统模式 传统模式的 缺点 : 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常 中间件模式: 中间件模式的的 优点 : 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。 2、使用了消息队列会有什么缺点? 分析 :一个使用了MQ的项目,如果连这个问题都没有考虑过,就把MQ引进去了,那就给自己的项目带来了风险。我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好预防。 要记住,不要给公司挖坑! 回答 :回答也很容易,从以下两个个角度来答 系统可用性降低 :你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去

windows消息和消息队列

早过忘川 提交于 2020-01-16 10:42:50
windows消息和消息队列 转自: http://blog.163.com/zhangjie_0303/blog/static/990827062010113062446767/ 与基于MS - DOS的应用程序不同,Windows的应用程序是事件(消息)驱动的。它们不会显式地调用函数(如C运行时库调用)来获取输入,而是等待windows向它们传递输入。 windows系统把应用程序的输入事件传递给各个窗口,每个窗口有一个函数,称为窗口消息处理函数。窗口消息处理函数处理各种用户输入,处理完成后再将控制权交还给系统。窗口消息处理函数一般是在注册一个窗口的时候指定的。你可以从典型的SDK程序中窗口消息处理函数是怎么声明和实现的。 对于Windows XP系统:如果顶层窗口停止响应消息超过几秒钟,系统会认为窗口无回应。在这种情况下,系统将隐藏这个窗口,然后生成一个影子(ghost)窗口覆盖在它上面。这个影子窗口具有着相同的Z轴顺序,位置,大小,显示属性。影子窗口允许用户将其移动,调整大小,甚至关闭(关闭的是停止响应的window)。此时只有这几个动作是被允许的,在调试模式下,系统不会生成影子窗口。 本节讨论以下主题: Windows消息 1. 消息类型 2. 消息传递 3. 消息处理 4. 消息过滤 5. post message和send message 6. 消息死锁 7.

消息队列选型

我与影子孤独终老i 提交于 2020-01-16 10:41:58
消息队列(Message Queue),简称MQ,本质是一个队列,用于存放数据(message),先入先出(FIFO)。主要用于系统解耦、消息缓存。 目前市面上消息队列的实现有很多种,下面调研了kafka/rabbitMQ/rocketMQ,这三种应用都非常广泛,期望从中选出最合适我们的。 简介 Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。 RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。 RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理

Kafka、RabbitMQ、RocketMQ消息中间件的对比

扶醉桌前 提交于 2020-01-16 10:40:48
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,目前对Kafka、RabbitMQ、RocketMQ这三个消息中间件做下对比分析。 - - kafka RocketMQ RabbitMQ 数据来源 相关文章 定位 设计定位 系统间的数据流管道,实时数据处理。 例如:常规的消息系统、网站活性跟踪,监控数据,日志收集、处理等 非日志的可靠消息传输。 例如:订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等 可靠消息传输。和RocketMQ类似。 基础对比 成熟度 日志领域成熟 成熟 成熟 所属社区/公司 Apache Alibaba开发,已加入到Apache下 Mozilla Public License 社区活跃度 高 中 高 来源于网络 API完备性 高 高 高 文档完备性 高 高 高 来源于网络 开发语言 Scala Java Erlang 支持协议 一套自行设计的基于TCP的二进制协议 自己定义的一套 (社区提供JMS--不成熟) AMQP 客户端语言 C/C++、Python、Go、Erlang、.NET、Ruby、Node.js、PHP等 Java Java、C、 C++、 Python、 PHP、Perl 等 持久化方式 磁盘文件 磁盘文件 内存、文件 可用性、可靠性比较 部署方式 单机/集群

MQ消息队列

可紊 提交于 2020-01-16 10:40:28
一、为什么使用消息队列? 大多数情况下,使用消息队列目的是:: 解耦、异步、削峰 。 通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,彻底解耦了 通过MQ,使得同步的操作变为异步操作,提高效率。 通过MQ,控制服务可以接收到的请求数量 二、消息队列有什么优缺点 优点就是在特殊场景下有其对应的好处, 解耦、异步、削峰 缺点有以下几个: 系统可用性降低 系统引入的外部依赖越多,越容易挂掉。需要保证消息队列的高可用 系统复杂度提高,保证消息没有重复消费,怎么处理消息丢失的情况,怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。 一致性问题 A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。 三、如何解决消息丢失? ack(消费者确认)( 消费者手动ack ) 持久化 (交换机、队列、消息) 不推荐使用消息事务,会验证降低性能 生产者确认(publisher confirm):生产者发送消息后,等待mq的ACK,如果没有收到或者收到失败信息,则重试。如果收到成功消息则业务结束。 channel.waitForConfirmsOrDie(10000); 可靠消息服务(可选,自己编写逻辑):对于部分不支持生产者确认的消息队列,可以发送消息前

RocketMQ与Kafka对比(18项差异)

帅比萌擦擦* 提交于 2020-01-16 10:39:17
RocketMQ与Kafka对比(18项差异) 原文链接: https://github.com/alibaba/RocketMQ/blob/master/wiki/kafka_partitions_problem.md 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,Kafka无限消息堆积,高效的持久化速度吸引了我们,但是同时发现这个消息系统主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,为此我们重新用Java语言编写了RocketMQ,定位于非日志的可靠消息传输(日志场景也OK),目前RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。 数据可靠性 RocketMQ支持异步实时刷盘,同步刷盘,同步Replication,异步Replication Kafka使用异步刷盘方式,异步Replication/同步Replication 总结:RocketMQ的同步刷盘在单机可靠性上比Kafka更高,不会因为操作系统Crash,导致数据丢失。

celery --分布式任务队列

一曲冷凌霜 提交于 2020-01-16 08:51:17
celery --分布式任务队列 一、介绍 celery是一个基于python开发的分布式异步消息任务队列,用于处理大量消息,同时为操作提供维护此类系统所需的工具。 它是一个任务队列,专注于实时处理,同时还支持任务调度。如果你的业务场景中需要用到异步任务,就可以考虑使用celery 二、实例场景 1、你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。 2、你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福 三、优点 1、简单:一但熟悉了celery的工作流程后,配置和使用还是比较简单的 2、高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务 3、快速:一个单进程的celery每分钟可处理上百万个任务 4、灵活:几乎celery的各个组件都可以被扩展及自定制 四、入门 celery 需要一个解决方案来发送和接受消息,通常,这是以称为消息代理的单独服务的形式出现的 有以下几种解决方案,包括: 一:RabbitMQ(消息队列,一种程序之间的通信方式) rabbitmq 功能齐全,稳定,耐用且易于安装。它是生产环境的绝佳选择。

大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合

£可爱£侵袭症+ 提交于 2020-01-16 06:41:26
http://www.aboutyun.com/thread-6855-1-1.html 个人观点:大数据我们都知道hadoop,但并不都是hadoop.我们该如何构建大数据库项目。对于离线处理,hadoop还是比较适合的,但是对于实 时性比较强的,数据量比较大的,我们可以采用Storm,那么Storm和什么技术搭配,才能够做一个适合自己的项目。下面给大家可以参考。 可以带着下面问题来阅读本文章: 1.一个好的项目架构应该具备什么特点? 2.本项目架构是如何保证数据准确性的? 3.什么是Kafka? 4.flume+kafka如何整合? 5.使用什么脚本可以查看flume有没有往Kafka传输数据 做软件开发的都知道模块化思想,这样设计的原因有两方面: 一方面是可以模块化,功能划分更加清晰,从“数据采集--数据接入--流失计算--数据输出/存储” 1).数据采集 负责从各节点上实时采集数据,选用cloudera的flume来实现 2).数据接入 由于采集数据的速度和数据处理的速度不一定同步,因此添加一个消息中间件来作为缓冲,选用apache的kafka 3).流式计算 对采集到的数据进行实时分析,选用apache的storm 4).数据输出 对分析后的结果持久化,暂定用mysql 另一方面是模块化之后,假如当Storm挂掉了之后,数据采集和数据接入还是继续在跑着,数据不会丢失

Kafka使用总结与生产消费Demo实现

℡╲_俬逩灬. 提交于 2020-01-15 19:01:34
什么是kafka Kafka官网自己的介绍是:一个可支持分布式的流平台。 kafka官网介绍 kafka三个关键能力: 1.发布订阅记录流,类似于消息队列与企业信息系统 2.以容错的持久方式存储记录流 3.对流进行处理 kafka通常应用再两大类应用中: 1.构建实时流数据管道,在系统或应用程序之间可靠地获取数据 2.构建转换或响应数据流的实时流应用程序 kafka的一些基本概念: 1.Kafka作为一个集群运行在一个或多个服务器上,这些服务器可以跨越多个数据中心。 2.Kafka集群将记录流存储在称为topic的类别中。 3.每个记录由一个键、一个值和一个时间戳组成。 kafka核心API: 1.Producer API:允许应用程序将记录流发布到一个或多个topic。 2.Consumer API:允许应用程序订阅一个或多个topic并处理生成给它们的记录流。 3.Streams API:允许应用程序充当流处理器,使用来自一个或多个topic的输入流, 并生成一个或多个输出topic的输出流,从而有效地将输入流转换为输出流。 4.Connector API:允许构建和运行可重用的生产者或消费者,将topic连接到现有的应用程序或数据系统。 例如,到关系数据库的连接器可能捕获对表的每个更改。 作为消息系统 传统消息传递有两类模型:消息队列、发布订阅。在消息队列中

Kafka丢失数据问题优化总结

笑着哭i 提交于 2020-01-15 06:05:39
数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下: 是否真正的存在数据丢失问题,比如有很多时候可能是其他同事操作了测试环境,所以首先确保数据没有第三方干扰。 理清你的业务流程,数据流向,数据到底是在什么地方丢失的数据,在kafka 之前的环节或者kafka之后的流程丢失?比如kafka的数据是由flume提供的,也许是flume丢失了数据,kafka 自然就没有这一部分数据。 如何发现有数据丢失,又是如何验证的。从业务角度考虑,例如:教育行业,每年高考后数据量巨大,但是却反常的比高考前还少,或者源端数据量和目的端数据量不符 定位数据是否在kafka之前就已经丢失还事消费端丢失数据的 kafka支持数据的重新回放功能(换个消费group),清空目的端所有数据,重新消费。 如果是在消费端丢失数据,那么多次消费结果完全一模一样的几率很低。 如果是在写入端丢失数据,那么每次结果应该完全一样(在写入端没有问题的前提下)。 kafka环节丢失数据,常见的kafka环节丢失数据的原因有: 如果auto.commit.enable=true,当consumer fetch了一些数据但还没有完全处理掉的时候,刚好到commit interval出发了提交offset操作,接着consumer