mq

MQ消息队列

纵然是瞬间 提交于 2019-11-27 09:52:40
大家平时也有用到一些消息中间件(MQ),但是对其理解可能仅停留在会使用API能实现生产消息、消费消息就完事了。 对MQ更加深入的问题,可能很多人没怎么思考过。 比如,你跳槽面试时,如果面试官看到你简历上写了,熟练掌握消息中间件,那么很可能给你发起如下 4 个面试连环炮! 为什么要使用MQ? 使用了MQ之后有什么优缺点? 怎么保证MQ消息不丢失? 怎么保证MQ的高可用性? 本文将通过一些场景,配合着通俗易懂的语言和多张手绘彩图,讨论一下这些问题。 为什么要使用MQ? 相信大家也听过这样的一句话:好的架构不是设计出来的,是演进出来的。 这句话在引入MQ的场景同样适用,使用MQ必定有其道理,是用来解决实际问题的。而不是看见别人用了,我也用着玩儿一下。 其实使用MQ的场景有挺多的,但是比较核心的有3个: 异步、解耦、削峰填谷 异步 我们通过实际案例说明:假设A系统接收一个请求,需要在自己本地写库执行SQL,然后需要调用BCD三个系统的接口。 假设自己本地写库要3ms,调用BCD三个系统分别要300ms、450ms、200ms。 那么最终请求总延时是3 + 300 + 450 + 200 = 953ms,接近1s,可能用户会感觉太慢了。 此时整个系统大概是这样的: 但是一旦使用了MQ之后,系统A只需要发送3条消息到MQ中的3个消息队列,然后就返回给用户了。 假设发送消息到MQ中耗时20ms

微服务分布式事务的实现方法及替代方案

ぐ巨炮叔叔 提交于 2019-11-27 06:05:43
微服务–分布式事务的实现方法及替代方案 这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正! 概念澄清 事务补偿机制 : 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务. CAP理论 : CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面, 只能同时择其二进行实现. 常见的有CP系统, AP系统. 幂等性 : 简单的说, 业务操作支持重试 , 不会产生不利影响. 常见的实现方式: 为消息额外增加唯一ID. BASE (Basically avaliable, soft state, eventually consistent): 是分布式事务实现的一种理论标准. 柔性事务 vs. 刚性事务 刚性事务是指严格遵循ACID原则的事务, 例如单机环境下的数据库事务. 柔性事务是指遵循BASE理论的事务, 通常用在分布式环境中, 常见的实现方式有: 两阶段提交(2PC), TCC补偿型提交, 基于消息的异步确保型, 最大努力通知型. 通常对本地事务采用刚性事务, 分布式事务使用柔性事务. 先上结论, 再分别介绍分布式事务的各种实现方式. 如果业务场景需要强一致性, 那么尽量避免将它们放在不同服务中,

RabbitMQ:四种ExChange用法

假装没事ソ 提交于 2019-11-27 05:44:29
RabbitMQ:四种ExChange用法 tonytonyyang 2017-08-21 17:50:49 浏览5971 RabbitMQ发送消息时,都是先把消息发送给ExChange(交换机),然后再分发给有相应RoutingKey(路由)关系的Queue(队列)。 ExChange和Queue之前是多对多的关系。 RabbitMQ 3.0之后创建ExChange时,有四种类型可选“fanout、direct、topic、headers”。 一、fanout 当向一个fanout发送一个消息时,RoutingKey的设置不起作用。 消息会被发送给同一个交换机下的所有队列,每个队列接收到的消息是一样的; 一个队列内有所有消费者(包含那些并没有相应RoutingKey的 消费者 ),将平分队列接收到的消息 。 ----------------消息生产者---------------- ConnectionFactory factory = new ConnectionFactory(); factory.setHost(S_RabbitMQ.QUEUE_IP);// MQ主机 factory.setPort(S_RabbitMQ.QUEUE_PORT);// MQ端口 factory.setUsername(S_RabbitMQ.QUEUE_USER);// MQ用户名

Java program to connect WMQ with User Id instead of channel

可紊 提交于 2019-11-27 04:54:29
问题 I have the requirement like connecting MQ with userid instead of channel. I have tried with setting user id and password without chanel to MQEnvironment class but got the below exception. " com.ibm.mq.jmqi.JmqiException: CC=2;RC=2540;AMQ9520: Channel not defined remotely. [3=]." Please guide me, is it possible to write java client to connect MQ with user id instead of channel. 回答1: There are 2 ways for an MQ application to connect to a queue manager: bindings and client mode. Bindings mode

RabbitMQ队列

只谈情不闲聊 提交于 2019-11-27 04:02:55
几种MQ的比较 ActiveMQ 基于 java 开发,遵循 JMS 规范,产品不怎么维护了,适合中小型企业使用 RabbitMQ 基于 erlang 开发, erlang 先天性支持高并发,支持 AMQP 协议,适合对稳定性要求高的企业级应用 Kafka 基于 java 开发,高性能,高吞吐量,可动态扩容,应用在大数据日志处理 RabbitMQ 应答模式分为自动应答和手动应答 RabbitMQ 五种队列模式 ①简单队列(点对点),一个生产者将消息投递到消息队列,只能有一个消息者进行消费 ②工作队列(能者多劳) ③发布订阅模式 ④路由模式 ⑤通配符模式 来源: https://www.cnblogs.com/moris5013/p/11343357.html

SpringBoot整合RabbitMQ实战---一遍就懂

房东的猫 提交于 2019-11-27 02:29:17
☆最近项目需要用到MQ,博主还真的没有在实际应用中使用过MQ。这次刚好实践并记录下 PS:关于MQ的一些概念和简介博主在这里就不去赘述了 第一步:添加依赖 1 <!--RabbitMQ依赖--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-amqp</artifactId> 5 </dependency> 第二步:RabbitTemplate rabbitTemplate; 1 @Autowired 2 RabbitTemplate rabbitTemplate; 第三步:将消息添加到MQ中 1 /将所有的请求到放到MQ中 2 rabbitTemplate.convertAndSend(RabbitMQExchangeQueueConfig.getRabbitmq_direct_exchange(), RabbitMQExchangeQueueConfig.getRabbitmq_routing_key(), urlPath); 第四步:从MQ中消费消息 1 //从队列中取值 2 abbitTemplate.receiveAndConvert(RabbitMQExchangeQueueConfig.getRabbitmq_routing

阿里消息中间件ONS的应用场景(一)

前提是你 提交于 2019-11-27 02:08:10
消息中间件的产生主要是为了达到以下目的: 异步 解耦 最终一致性 并行 下面我们来看针对同一件事情,不同的处理办法: 过年了拜年发微信: 普通青年:编辑微信,群发给所有人。 文艺青年:编辑微信,交给美腻秘书发送,自己已去...... 二笔青年:编辑微信,发送;编辑微信,发送;编辑微信,发送;.......... 我们现在主要关注第二种场景,它的使用方式实现了解耦操作和异步操作。 举一个淘宝的简单例子: 一笔交易的完成涉及到很多系统协调操作的过程,如上多个系统,但如果只是串行的执行这些操作,可能还没执行完这些操作,用户可能已没有耐心,离开了操作界面。给用户留下不好的用户体验。 现在消息中间件就派上了用场: (以下截图都取自阿里沈询消息中间件ONS讲解) 消息中间件具有减少延迟,提升用户体验(异步解耦) 最终一致性:如果由于消息中间件消费端的一个模块 crash 了,而出现的短暂不一致现象,而该模块恢复以后会重新完成它的操作,最终保证数据操作的一致性,我们可以使用消息中间件来保证最终状态的统一。 并行:因为消息时并行发送到各个消息队列的,也是并行的被各个系统进行处理的,系统的高效可以由此得到保证。 ONS的设计思路: 消息中间件的难点主要是在于权衡和取舍。 设计假定: 每台PC机器都可能down机不可服务 任意集群都可能处理能力不足 最坏的情况一定会发生

MQ 2035(MQRC_NOT_AUTHORIZED)

我只是一个虾纸丫 提交于 2019-11-27 00:18:29
  当使用MQ7.1或7.5时,如果使用MQ管理员账号去连接MQ服务器,可能会报以下的错误,提示你权限不足。   2035 MQRC_NOT_AUTHORIZED 在之前的版本中是没有这个问题的。   原因是在7.1版本中 "Channel Authentication Records" (CHLAUTH) 默认被设置为ENABLED   可以用下面的命令来验证:    $runmqsc TEST01(队列管理器名称)   DISPLAY QMGR CHLAUTH   AMQ8408: Display Queue Manager details.   QMNAME(TEST01) CHLAUTH(ENABLED)  以上最后一行的 ENABLED表示被设置了。 最简单的解决方法就是禁用“ Channel Authentication Records”的功能。 运行以下命令:    $runmqsc TEST01(队列管理器名称)   ALTER QMGR CHLAUTH(DISABLED) 转载于:https://www.cnblogs.com/jmax/p/3332908.html 来源: https://blog.csdn.net/weixin_30924087/article/details/99222591

IBM MQ扩大队列最大消息长度

依然范特西╮ 提交于 2019-11-27 00:17:29
要设置MQ的最大消息长度,需要考虑同时设置队列管理,队列以及通道的最大消息长度。 具体操作如下: runmqsc 队列管理器名称 alter qmgr maxmsgl(10000000) 1 : alter qmgr maxmsgl(10000000) AMQ8005: WebSphere MQ queue manager changed. alter ql(client.queue.local) maxmsgl(10000000) 2 : alter ql(client.queue.local) maxmsgl(10000000) AMQ8008: WebSphere MQ queue changed. alter chl(client.sdr) maxmsgl(10000000) 3 : alter chl(client.sdr) chltype(sdr) maxmsgl(10000000) AMQ8016: WebSphere MQ channel changed. 其中 client.queue.local 是队列名称, client.sdr 是通道名称。 转载于:https://www.cnblogs.com/jmax/p/3780041.html 来源: https://blog.csdn.net/weixin_30216687/article/details

Rabbit MQ 学习参考

为君一笑 提交于 2019-11-26 20:22:18
网上的教程虽然多,但是提供demo的比较少,或者没有详细的说明,因此,本人就照着网上的教程做了几个demo,并把代码托管在码云,供有需要的参考。 项目地址: https://gitee.com/dhclly/IceDog.RabbitMQ 项目属性: .net core , .net rabbit mq 客户端程序。 RMQ相关资料收集链接: https://gitee.com/dhclly/icedog.script.test/blob/master/doc/rabbitMQ/rabbitMQ.md https://gitee.com/dhclly/icedog.script.test/blob/master/doc/rabbitMQ/rabbitMQ-article.md 项目运行要求:安装好了rabbit mq 服务,嫌麻烦可以直接用docker 镜像 ,总之假设你装好了。 把项目下载下来后,相关目录都有readme.md 文档,可以阅读。 运行起来就几点 第一: https://gitee.com/dhclly/IceDog.RabbitMQ/blob/master/src/IceDog.RabbitMQ.ConfigurationService/Factories/FactoryProvider.cs 在这个代码页配置上你的rmq服务的主机名,端口,账号,密码