学习
实践
活动
工具
TVP
写文章

业务处理成功,发送MQ失败

简言之,就是要让数据库操作和发送MQ是在同一个事务内! 事务消息 可能有人想到了,这不就是事务消息嘛!没错,不过不同的MQ事务消息也有所不同。 kafka事务消息 kafka事务类似数据库事务,就是一条消息要发往多个分区的时候,它可以保证发往的这多个分区同时成功或者失败,这种事务显然不能解决上面的问题。 一阶段先发送一条half消息MQ Server,此时这条消息对消费者是不可见的;接着执行业务逻辑;二阶段根据业务逻辑的执行结果,判断MQ的事务是提交还是回滚,如果提交,那么这条消息就可以被消费者消费了 补偿措施:如果根据业务逻辑对MQ事务执行提交或者回滚时因为超时等原因失败了,MQ Server会回调业务端的接口,通过这个接口去查询刚才的业务到底成功了没有,根据查询结果再决定MQ的事务要提交还是回滚。 其他方案 新建一个表用来保存生产者生产的消息; 在执行业务逻辑的方法里,不直接把消息发往MQ,而是先入库; 这样可以保证这两个入库操作是同一个数据库事务; 最后通过定时任务去查询库中的消息,发往MQ,发失败了还可以通过该任务重发

8920

发送和接收IBM WebSphere MQ消息

发送和接收IBM WebSphere MQ消息InterSystems IRIS为IBM WebSphere MQ提供了一个接口,可以使用该接口在InterSystems IRIS和IBM WebSphere MQ消息队列之间交换消息。 如果正在发送消息,这应该是这些消息的字符集。如果不指定字符集,则MQ系统假定消息使用为MQ客户端指定的默认字符集。如果要检索邮件,则这是要将这些邮件翻译为的字符集。 PutApplType指定PUT Application Type消息描述符选项。发送消息发送邮件,请执行以下操作:按照“创建连接对象”中的说明创建连接对象。 %GetLastError() Quit check}示例3:从终端发送消息以下示例显示了向IBM WebSphere MQ队列发送消息的终端会话。

32930
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【SpringBoot MQ 系列】RabbitMq 消息发送基本使用姿势

    MQ 系列】SprigBoot + RabbitMq 消息发送基本使用姿势 前面两篇博文,分别介绍了RabbitMq的核心知识点,以及整合SpringBoot的demo应用;接下来也该进入正题 发送Object类型消息失败的case <! 配置类 通过前面rabbitmq的知识点学习,我们可以知道发送端的主要逻辑 “将消息发送给exchange,然后根据不同的策略分发给对应的queue” 本篇博文主要讨论的是消息发送,为了后续的实例演示, mq的性能,丢失一些数据也可以接受;这个时候我们可能需要定制一下发送消息属性(比如将消息设置为非持久化的) 下面提供两种姿势,推荐第二种 /** * 推送一个非持久化的消息,这个消息推送到持久化的队列时 非序列化对象发送异常case 通过查看rabbitTemplate#convertAndSend的接口定义,我们知道发送消息可以是Object类型,那么是不是意味着任何对象,都可以推送给mq呢?

    56240

    企业微信发送应用消息部分失败

    最近公司使用企业微信,让我写了一个通知中心通过发送应用消息通知成员。后来发现有部分成员会漏收,仔细看了api文档发现发送应用消息也是有限制的。

    36630

    消息队列MQ

    因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来 实际项目中发送MQ消息,如果不做集群,其中mq机器出了故障宕机了,那么mq消息就不能发送了,系统就崩溃了,所以我们需要集群MQ,当其中一台MQ出了故障,其余的MQ机器可以接着继续运转,在生产中,没人使用单机的消息队列 ,消息队列一般都会持久化到磁盘这个不用担心,然后生产者数据丢失的话MQ的事务会回滚,可以尝试重新发送,消费者丢的的话一般都是采用了自动确认消息模式导致消费信息被删,只要修改为手动确认就行了,也就是说消费者消费完之后 这个问题是生产环境出现事故后的,考察你如何快速的解决问题,,消息队列的延迟和过期失效是消息队列的自我保护机制,目的是为了防止本身被挤爆,当然是可以关闭保护,比如当某个消息消费失败5次后,就把这个消息丢弃等

    92310

    消息队列应用场景&&ActiveMQ消息发送失败的处理方案

    今天我们来介绍一下ActiveMQ消息队列消息发送失败的处理方案。     在介绍今天的内容之前,首先我们来探讨一下为什么要用MQ。 企业中系统为什么要用消息队列那? 然后系统 C 就是发送消息MQ 中间件里,由系统 D 消费到消息之后慢慢的异步来执行这个耗时 2s 的业务处理。通过这种方式直接将核心链路的执行性能提升了 10 倍。 ?    接下来,我们探讨一下ActiveMQ消息队列消息发送失败的处理方案    这个问题与其讨论MQ消息队列消息发送失败的解决方案,等同于探讨中间件如何保证消息的一致性的问题? ——–>如果成功: 修改数据的状态,把待确认改为待发送,再把信息发给MQ,        第一种情况:在MQ发送信息到消费方有可能导致数据丢失,消费方无法接收信息,那么之前插入数据库中那条数据还是处于待发送状态 ,如果数据丢失,消费方无法接收信息,生产者有个定时任务,会不断去数据库找状态为待发送的那条记录,如果找到待发送这条数据就再次把信息发到MQ,因为不会无限次数发送,因此如果发送6次均为失败就会转人工客服,

    32210

    利用alertover发送获取响应失败的通知消息

    本人在做接口自动化时候,因为服务器不稳定造成可能的用例失败,但这个失败表象只是在获取响应实体的json对象时为空,在后期排查问题时可能造成困扰,所以特意加了一个获取响应失败的通知,目的就是即使了解到服务器异常 code, LOCAL_IP, COMPUTER_USER_NAME); } catch (Exception e) { logger.warn("获取请求相应失败 SysInit.isBlack(requestInfo.getHost())) new AlertOver("接口请求失败", requestInfo.toString( 提醒推送 */ public void sendRemindMessage() { sendMessage(remind); } /** * 发送消息 ("sound", "pianobar");// 发送声音 logger.debug("消息详情:{}", jsonObject.toString()); HttpPost

    24010

    MQ消息丢失问题

    消息中间件消息丢失问题,由于本人只用过rabbitmq和kafka,就这两种中间件简单说明一下 rabbitmq中间件 生产者消息丢失 这里生产者在发送的过程中,由于网络问题导致消息没有发送mq,有两种解决办法 使用事务 使用ack机制 Rabbitmq就是生产在发送消息的时候,开启了事物channel.txSelect,然后发消息,如果发送过程中出现异常,就是调用channel.txRollback进行回滚 ,如果正常发送,则调用channel.txCommit //开启事务 channel.txSelect try { 这⾥发送消息 } catch (Exception e) { channel.txRollback 另外一种就是ack,开启confirm模式,发送的每一条消息都有一个唯一的表示id,当发送到rabbitmq成功之后,rabbitmq会返回一个ack消息,告诉消息正常发送了,如果rabbitmq没有接收到消息 ,就会回调接口nack接口,这里也可以进行重新发送消息,或者等待超时没有回调,也可以发送消息,这样就可以保证生产者不丢失消息 rabbitmq消息丢失 这里大多数原因是因为消息接收到了mq,但是服务挂了

    3820

    消息队列简介(MQ)

    一、什么是消息队列 消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。 四、几种常见的MQ队列 1.RabbitMQ 官网: http://www.rabbitmq.com/ 开发语言: Erlang 支持客户端语言言: Erlang,java,Ruby等 协议: AMQP RabbitMQ是一个消息传递代理—消息传递的中介。它为您的应用程序提供了一个发送和接收消息的公共平台,并为您的消息提供了一个安全的地方,直到收到消息为止。它的特性包括可靠性、高可用性、集群和联合。 其中 NameServer: 为 producer 和 consumer 提供路由信息 Producer: 为消息生产者,生产者的作用就是将消息发送MQ,生产者本身既可以产生消息 Consumer: 为消息消费者,消费 MQ 上的消息的应用程序就是消费者 Broker: RocketMQ系统的主要角色,及队列。

    71330

    消息被拒MQ

    生产者 /** * 消息被拒的情况 */ public class Produce0001 { private static final String NORMAL_EXCHANGE NORMAL_EXCHANGE,"zhangsan",null,message.getBytes(StandardCharsets.UTF_8)); System.out.println("生产者发送消息 "+message); } } } 消费者: /** * 消息被拒的情况 */ public class Consumer0001 { //普通交换机 //正常队列设置的最大限制长度 params.put("x-max-length",6); System.out.println("等待接收消息 } else { System.out.println("01接收到消息

    7840

    MQ回退消息 springboot

    Mandatory参数   在仅开启了生产者确认机制的情况下,交换机接收到消息后,会直接给消息生产者发送确认消息,如果发现该消息不可路由,那么消息会被直接丢弃,此时生产者是不知道消息被丢弃这个事件的。 那么如何让无法被路由的消息帮我想办法处理一下?最起码通知我一声,我好自己处理啊。通过设置mandatory参数可以在当消息传递过程中不可达目的地时将消息返回给生产者。     ,会将该消息返回给生产者 * false: * 如果发现消息无法进行路由,则直接将消息扔掉 */ rabbitTemplate.setMandatory rabbitTemplate.convertAndSend("confirm.exchange","key2",message+"key2",correlationData1); log.info("发送消息 id位{}内容为{}",correlationData1.getId(),message+"key1"); log.info("发送消息id位{}内容为{}",correlationData1

    6040

    MQ·将多消息合并为一条消息发送、消费的设计与实现

    由于mq使用的是亚马逊的sqs服务,而sqs是按请求数消费的原因,所以才有的将多消息合并为一条消息发送的想法。 将大量消息合并为一个消息后会导致消息消费失去原子性。你无法保证原本是256个消息的合并为一个消息后,这256个消息能全部消费成功或者全部消费失败,因此要求业务必须允许消息消费失败直接丢弃的情况。 无论多少个成功多少个失败,都需要将整条消息mq中删除。笔者考虑过这个问题才决定是否要这样做的,也考虑过失败重试的问题,但我觉得没必要为这种概率买单,因为一个点击在非异步的情况下,失败就是失败了。 每个MesaageLooper的run方法实现的就是一个死循环,从阻塞队列中拿消息,当消息等于256时,或者阻塞超过1s就将拿到的消息合并成一个消息发送mq。 如果阻塞队列满,那么push会直接将消息发送mq。因此,服务重启时如果使用kill 9强行结束进程,至多只会有1s的数据丢失。设置1s还有一个原因就是控制消息的实时性。

    1.6K10

    消息中间件-MQ

    消息中间件 MQ 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 此通信主要可由消息队列系统执行。 银行总部可以发送一个请求,它需要的储蓄帐户申请毛利。然后,保存帐户应用程序计算这些信息,以 XML 的形式存储它们,并将其放置到远程队列中。 关于队列管理器的一些重要细节 拥有/管理 WebSphere MQ Application 的全部功能 不负责传输数据 包含一个通道和端口,用于将数据传输到特定的目标队列,或在内部存储消息,直到其他队列选择消息为止 应用程序可以有多个队列管理器/通道来通信消息 使用 MQ 进行功能测试 应用程序配置 队列配置 信息格式 消息正确性和完整性 信息传递 消息失败时,当它们发生了什么 遵循与技术示例中所示的方法类似的方法 、连接性问题、远程队列问题等都会导致消息通信失败

    19620

    消息队列 MQ 专栏】消息队列之 Kafka

    用 Consumer Group 还可以将 Consumer 进行自由的分组而不需要多次发送消息到不同的 Topic 。 运行 Consumer 先运行 Consumer ,这样当生产者发送消息的时候能在消费者后端看到消息记录。 7. topic 是必须的,因为需要发送消息给订阅了该topic 的 consumer group 。现在可以在命令行里输入一些信息,每一行会被作为一个消息。 ? 发送消息 5. =104857600 #这个参数是向 kafka 请求消息或者向 kafka 发送消息的请求的最大数,这个值不能超过 jvm 的堆栈大小 num.partitions=1 #默认的分区数,一个 topic 所以单纯的去测试 MQ 的速度没有任何意义,Kafka 的这种暴力的做法已经脱了 MQ 的底裤,更像是一个暴力的数据传送器。 ----

    65900

    消息队列 MQ 专栏】RabbitMQ

    消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。 消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。 为何用消息队列 从上面的描述中可以看出消息队列是一种应用间的异步协作机制,那什么时候需要使用 MQ 呢? 这种场景下就可以用 MQ ,在下单的主流程(比如扣减库存、生成相应单据)完成之后发送一条消息MQ 让主流程快速完结,而由另外的单独线程拉取MQ消息(或者由 MQ 推送消息),当发现 MQ 中有发红包或发短信之类的消息时 生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。 ?

    58300

    PHP使用MQ消息队列

    autoload.php'); use app\synchronous\model\RabbitMqModel; use PhpAmqpLib\Connection\AMQPStreamConnection; 4.发送到队列数据代码 /** * MQ生产数据 * @param $queueName 队列名称 * @param $msg 发送数据 * @name MqPushLish * @author * @return */ MQ发送队列数据正常'); return true; }catch (\Exception $e){ //打印日志 DeShangLog::log(1, $e->getMessage() ,'MQ发送队列数据异常 ') , C('config_mq.port') , C('config_mq.user') , C('config_mq.password')); $channel = $connection->channel 发送队列数据异常!!!!!!!!!!!!!!!!')

    32320

    消息队列 MQ 专栏】消息队列之 ActiveMQ

    Queue,队列,点对点模式下特定生产者向特定队列发送消息,消费者订阅特定队列接收消息并进行业务逻辑处理。 使用网络连接器的简单场景 如图所示,服务器 S1 和 S2 通过 NewworkConnector 相连,生产者 P1 发送消息,消费者 C3 和 C4 都可以接收到,而生产者 P3 发送消息,消费者 S2,但这只是单方向的通信,发送到 S2 上的的消息还不能发送到 S1 上。 这样实际代码直接通过 jmsTemplate 来发送和接收消息,而每次发送接收消息时创建连接工厂、创建连接、创建会话等工作都由 Spring 框架做了。 重点是下面的两个发送消息的方法,sendQueueMessage 向队列发送消息,sendTopicMessage 向主题发送消息,两种模式都使用了 jmsTemplate 的 send 方法,send

    75500

    消息队列 MQ 专栏】消息队列之 RocketMQ

    支持顺序消息 可以保证消息消费者按照消息发送的顺序对消息进行消费。顺序消息分为全局有序和局部有序,一般推荐使用局部有序,即生产者通过将某一类消息按顺序发送至同一个队列来实现。 img 部署结构图 生产者 生产者(Producer)负责产生消息,生产者向消息服务器发送由业务应用程序系统生成的消息。 RocketMQ 提供了三种方式发送消息:同步、异步和单向。 同步发送 同步发送消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。一般用于重要通知消息,例如重要通知邮件、营销短信。 单向发送 单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发,适用于某些耗时非常短但对可靠性要求并不高的场景,例如日志收集。 初始化完成后,调用 send 方法发送消息,示例中只是简单的构造了100条同样的消息发送,其实一个 Producer 对象可以发送多个主题多个标签的消息消息对象的标签可以为空。

    1.6K00

    扫码关注腾讯云开发者

    领取腾讯云代金券