mq

2.RabbitMQ 的可靠性消息的发送

喜你入骨 提交于 2019-11-30 06:10:43
本篇包含 1、 RabbitMQ 的可靠性消息的发送 2、 RabbitMQ 集群的原理与高可用架构的搭建 3、 RabbitMQ 的实践经验 上篇包含 1、MQ 的本质,MQ 的作用 2、RabbitMQ 的特性,工作模型,交换机详解 3、Java API 编程,UI 管理界面 4、进阶知识:TTL、死信队列、延迟队列,服务端流控和消费端限流 5、Spring AMQP 核心组件 1. RabbitMQ 可靠性投递与高可用架构 1.1. 可靠性投递 在代码里面一定是先操作数据库再发送消息。避免因为数据库回滚导 致的数据不一致。 但是如果先操作数据,后发送消息,发送消息出了问题,那不是一样 会出现业务数据的不一致? 分析 RabbitMQ 的可靠性投递,也就是在使用 RabbitMQ 实现异步通 信的时候, 消息丢了怎么办,消息重复消费怎么办? 在 RabbitMQ 里面提供了很多保证消息可靠投递的机制,这个也是 RabbitMQ 的一 个特性。 我们在讲可靠性投递的时候,必须要明确一个问题,因为效率与可靠性是无法兼得 的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响。所以如果是一 些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率。 比如发送通知或者记录日志的这种场景,如果用户没有收到通知,不会造成业务影 响,只要再次发送就可以了。

IBM MQ

こ雲淡風輕ζ 提交于 2019-11-30 02:34:01
WebSphere MQ 概念 1. 一种中间件产品,实现了 消息队列 框架,介于应用和操作系统之间,相关应用的基础平台。 2. 以实现应用系统在异构的操作系统平台之间稳定可靠地传递,交换重要的数据和信息, 确保消息不丢失不复传 。 3. 提供了强大、 安全、 稳定的消息传递主干,可帮助搭建企业服务总线(ESB)的基础传输层。 4. 实现 MQI(Message Queue Interface) 接口,实现异步通信。消息队列接口为程序提供了一种异步通信方式。一个程序以一个队列作为中转与另一个程序相互通信,这个队列相对于该程序而言既可是本地的也可以是远程的。当程序A需要和程序B通信时,A只需PUT一条消息到一个和B相联系的队列上,程序A然后可以干别的事。它似乎感觉不到通信的发生, 通信以及对通信错误的恢复是由队列管理完成的 。 WebSphere MQ 主要对象 消息 数据的传输载体,与应用系统交互的数据均被包装成消息。 队列 是用于存储消息的数据结构 。按功能可以分为本地队列、远程队列、传输队列、模板队列、别名队列、死信队列等等。 队列管理器 在WebSphere MQ中队列管理器是基本的软件系统,队列管理器可看成是 队列和其他对象的容器 。 通道 是一种提供从 一个队列管理器到另一个队列管理器的通信路径 。它又叫消息通道

Most Efficient - Performance wise - for inter JVM communication

独自空忆成欢 提交于 2019-11-30 02:25:57
I have a Java application that require communication between different process. Process could run in same JVM or different JVM, but runs on the same machine. My application need to submit "messages" to another process (same or different JVM) and forgot about it. similar to messaging queue like IBM "MQ", but simple, and only use memory, no IO to hard disk for performance gains. I'm not sure what is the best approach from Performance prescriptive. I wonder if RMI is efficient in terms of Performance, I think it require some overhead. What about TCP/IP socket using local host? any other thought?

IBM WebSphere MQ介绍安装以及配置服务详解

非 Y 不嫁゛ 提交于 2019-11-30 02:24:41
附链接文章: java实现MQ客户端调用源码 首先介绍一下MQ MQ消息队列的简称是一种应用程序对应用程序的通信方法。说白了也就是通过队列的方式来对应用程序进行数据通信。而无需专用链接来链接它们。 MQ的通讯方式 1.数据报的方式 Datagram (Send and forget) 应用程序在创建完消息后。利用MQ的API将消息发送到队列中。它充分利用了MQ(once and once only ) 2.请求和应答方式 Request/Reply 发送消息之后需等待对方处理结果。 需考虑如下问题: a.等待应答的时间是多少? b.如果没有应答怎么办。 c.本次session是否需要保留? MQ的开发流程 1.让应用程序与队列管理器链接,通过MQconnect调用来进行此链接。 2.使用MQOpen调用为输出打开一个队列 3.应用程序使用MQPut调用将其数据放到队列上。 4.调用MQOpen调用打开输入队列 5.使用MQGet从队列上接收数据 安装步骤。(此处为转载文章,作者已经证实所有步骤。) Windows下 WebSphere MQ 服务端的安装: ( 1)把WebSphere MQ Windows版服务器CD-ROM插入CD-ROM驱动器。 ( 2)如果安装了自动运行,那么会启动安装进程。如果不启动,则双击CD-ROM上的根目录中的Setup图标以启动安装程序。 (3

MQ常问的问题

a 夏天 提交于 2019-11-30 01:35:52
目录 1:什么场景使用了mq? 直接掉接口不行吗? 2 :用消息队列都有什么优点和缺点? 3 :Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别? 4 :那你们是如何保证消息队列的高可用的? 5 :如何保证消息不被重复消费啊?如何保证消费的时候是幂等的啊? 6 :如何保证消息的可靠性传输啊?要是消息丢失了怎么办啊? 7 :那如何保证消息的顺序性? 8 :如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决? 9 :如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。 1:为什么使用MQ? 主要是: 解耦 、 异步 、 削峰 。 (1)解耦:A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃......A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码

聊聊mq的使用场景

感情迁移 提交于 2019-11-29 23:48:33
mq的作用 通过异步方式对系统解耦 增加系统的并发处理能力 通过异步方式对系统解耦 以用户注册为例,一般情况下: 分下一下,上面过程存在的一些问题: 注册过程会调用4个服务(注册服务、邮件服务、短信服务、积分服务),服务之间依赖性太强,任何一个服务不可用,直接影响整个注册业务 接口耗时太长,每个服务耗时100ms,注册流程耗时400ms 对用户来说,用户信息入库是主要的业务流程,其他并不是响应用户过程中直接关注的逻辑,可以异步进行处理 采用mq的方式实现: 过程: 调用注册服务,注册信息入库,耗时100ms 投递注册消息到mq 返回注册成功 对于用户来说耗时200ms 其他3个操作(发邮件、发短信、增加积分)从消息队列中拉取消息进行处理,对于主流程来说是异步操作 将依赖于3个服务转换为只依赖于mq服务,只需要保证注册服务、mq服务高可用,即可以保证注册服务的高可用,相比保证其他3个服务高可用上容易了许多。 增加系统的并发处理能力 以电商中的秒杀场景为例,采用同步处理: 用户点击秒杀 调用订单服务,验证库存、锁定库存 跳转到支付页面进行支付 分析一下,存在的问题: 验证库存、锁定库存会访问数据库 秒杀场景,商品数量有限,请求量非常大,每个请求来了都做以上处理,直接会把数据库压垮,导致数据库无法对外提供服务,数据库的不可用直接导致整个业务的不可用,秒杀活动打水漂。 大量请求会同时到达

两篇文章全面理解分布式事务问题(2) 柔性事务

若如初见. 提交于 2019-11-29 23:11:11
上一篇文章讲述的是抛弃A,保证CP的刚性分布式事务解决方案,这一篇介绍柔性分布式事务解决方案。 柔性事务遵循BASE理论,抛弃C,保证AP,以最终一致性来代替强一致性,柔性分布式事务解决方案中MQ承担非常重要的角色。 1.本地化消息表 A B两个分布式应用,各自有一个本地化消息表。 A中的业务和消息处于同一个本地事务中,也就意味着A的事务提交之后,消息表中也存放了这条消息。存完之后A系统会把这条消息发送到MQ.B接收到消息之后会写到本地消息表,同时执行业务逻辑.B应用也一样,业务和表处于同一个事务中。这里会有一个幂等操作,如果这条消息之前已经处理过,B就会回滚事务。B业务逻辑执行成功之后会更新消息的状态,同时更新A表的消息状态。 如果B系统处理失败了,那么就不会更新消息表状态,那么此时A系统会定时扫描自己的消息表,如果有没处理的消息,会再次发送到MQ中去,让B再次处理 这个方案保证了最终一致性,哪怕B事务失败了,但是A会不断重发消息,直到B那边成功为止 2.基于支持事务的MQ 上述方法有个比较不好地方,就是需要各个应用在本地建一个表,和业务耦合度比较高。有没有不需要本地建表的方法呢? 市面上有一些MQ支持事务的,比如RocketMQ。 在介绍这种方法之前先解释一下RocketMQ的几个名词 prepare消息 又名Half Message,半消息,标识该消息处于"暂时不能投递"状态

Redis 与 MQ 的区别

最后都变了- 提交于 2019-11-29 22:15:37
  Redis是一个高性能的key-value数据库,它的出现很大程度补偿了memcached这类key-value存储的不足。虽然它是一个数据库系统,但本身支持MQ功能,完全可以当做一个轻量级的队列服务器使用。   不过,Redis只是提供一个高性能的、原子操作内存键值队,具有高速访问能力,虽可用做消息队列的存储,但是不具备消息队列的任何功能和逻辑,要作做为消息队列来实现的话,功能和逻辑要通过上层应用自己实现。 Redis从2.0版本开始支持发布/订阅指令,发布者调用redis的publish方法往特定的channel发送消息,订阅者在初始化的时候要订阅到该channel,一旦有消息就会立即接收。 Redis 消息推送(基于分布式 pub/sub)多用于实时性较高的消息推送,并不保证可靠。 其他的mq和kafka保证可靠但有一些延迟(非实时系统没有保证延迟)。redis-pub/sub断电就清空,而使用redis-list作为消息推送虽然有持久化,但是也并非完全可靠不会丢。 另外一点,redis 发布订阅除了表示不同的 topic 外,并不支持分组。 比如,kafka中发布一个东西,多个订阅者可以分组,同一个组里只有一个订阅者会收到该消息,这样可以用作负载均衡。 性能上,对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间

Posix消息队列

可紊 提交于 2019-11-29 19:35:27
目录 1. 概述 2. Posix消息队列 创建与打开 关闭与删除 消息队列属性 获取属性 设置属性 消息发送与接收 3. 消息队列限制 4. 生产者消费者问题——Posix消息队列实现 单生产者 + 单消费者 多生产者 + 单消费者 5. 效率对比 1. 概述 消息队列可认为是一个消息链表,队列中的每个消息具有如下属性: 消息优先级,由发送者赋予 消息数据长度,可以为0 消息数据(如果消息数据长度大于0) Posix消息队列主要用于线程间消息的传递: A线程向队列中放置消息,B线程从队列中取出消息 A线程向队列写入消息之前,不需要B线程在该队列上等待消息的到达 A线程向队列写入消息之后,B线程可以在之后的某个时刻取出消息 A线程只关心向队列放入消息,B线程只关心从队列取出消息,A、B两个线程相互独立、互不影响 2. Posix消息队列 创建与打开 mq_open 用于创建一个新的消息队列或打开一个已存在的消息队列, 编译时需指定链接-lrt, 下面其他函数同理。 //成功返回消息队列描述符,失败返回-1 mqd_t mq_open(const char *name, int oflag, ... /* mode_t mode, struct mq_attr *attr */); 当创建一个新的消息队列时, attr参数用于给新队列指定某些属性, 若attr为NULL

快速掌握消息队列RabbitMQ

眉间皱痕 提交于 2019-11-29 12:17:36
※快速掌握消息队列RabbitMQ 一.RabbitMQ概述 (一)什么是消息队列MQ 消息队列(Message Queue),后文称MQ,是一种 跨进程的通信机制,用于上下游传递消息。 MQ作为消息中间件,最主要的作用系统之间的信息传 递进行“解耦”,MQ是数据可靠性的重要保障。 (二)什么是RabbitMQ RabbitMQ是全世界最火的开源消息代理服务器, 在全世界拥有超过35000个项目部署在 RabbitMQ。 RabbitMQ支持几乎所有的操作系统与编程语言。 Rabbit提供了高并发、高可用的成熟方案,支持 多种消息协议,易于部署与使用。 (三)和同类产品比较 (四)RabbitMQ应用场景 异构系统的数据传递 高并发程序的流量控制 基于P2P,P2PPP的程序 分布式系统的事务一致性TCC 高可靠性的交易系统 二.RabbitMQ单点安装 (一)安装步骤 (二)常用命令 启动与关闭 rabbitmq-server 前台启动服务 rabbitmq-server -detached 后台启动服务 rabbitmqctl stop 停止服务(相当于关闭进程) 终止与启动应用 rabbitmqctl start_app 启动应用 (不会关闭进程) rabbitmqctl stop_app 终止应用 用户管理 rabbitmqctl add_user {username}