(项目实战)RocketMQ5.0延迟消息在聚合支付系统中的应用

news2024/11/24 18:50:41

在这里插入图片描述

1 基于业务场景掌握RocketMQ5.0

本篇文章主要结合聚合支付系统中的业务场景来落地RocketMQ中间件的应用,聚合支付系统主要在支付系统超时订单和商户支付结果异步通知场景中会使用到RocketMQ消息中间件。本文使用到了RocketMQ中的延迟消息知识点,RocketMQ延迟消息投递等级一共为18个等级,具体投递等级和延迟时间如下

投递等级(delay level)延迟时间投递等级(delay level)延迟时间
11s106min
25s117min
310s128min
430s139min
51min1410min
62min1520min
73min1630min
84min171h
95min182h

RocketMQ消息类型主要有普通消息、顺序消息、延迟消息、批量消息、事务消息
在这里插入图片描述
接下来我们一起来分析延迟消息在具体业务场景中的应用吧

1.1 超时订单(下游商户未支付)

在聚合支付系统和下游商户系统业务场景中,下游商户在调用聚合支付系统支付接口后,用户实际并没有对该笔订单进行支付。所以这时我们需要对未支付的订单进行订单关闭操作,那么这时我们使用消息队列中的延迟消息实现该业务功能 ,以下为具体的业务流程
在这里插入图片描述

1.2 下游商户支付结果通知

下游商户调用聚合支付系统统一支付功能后,用户完成支付,这时支付渠道需要把用户支付结果返回给聚合支付系统,聚合支付系统再通过RocketMQ延迟消息通知给下游商户系统。该业务功能同样是基于消息队列的延迟消息进行技术实现,系统第一次通知采用RocketMQ普通实时消息进行支付结果通知,在没有收到商户系统支付通知响应结果时聚合支付系统会采用延迟消息每隔10s通知,循环通知5次。
在这里插入图片描述

2 RocketMQ延迟消息核心代码实现

本技术文档采用SpringCloud2021.x和RocketMQ5.0进行代码实现

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2021.xSpring Cloud 2021.x2.7.18

2.1 在SpringCloud中集成RocketMQ流程

2.1.1 引入RocketMQ Stream Starter
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
2.1.2 修改application.properties配置文件
server.port=1000
spring.application.name=rocketmq-delay-consume-pay
spring.cloud.stream.function.definition=consumer;
spring.cloud.stream.rocketmq.binder.name-server=localhost:9876
spring.cloud.stream.rocketmq.bindings.producer-out-0.producer.group=output_1
spring.cloud.stream.bindings.producer-out-0.destination=delay
spring.cloud.stream.bindings.consumer-in-0.destination=delay
spring.cloud.stream.bindings.consumer-in-0.group=delay-group
logging.level.org.springframework.context.support=debug

2.1.3 代码实现

1 生产者

package cn.itbeien.mq;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.context.annotation.Bean;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

/**
 * @author beien
 * @date 2024-06-19 23:00
 * Copyright© 2024 beien
 */
@Service
@Slf4j
public class ProducerService {
    @Autowired
    private StreamBridge streamBridge;

    /**
     * 生产者
     * @return
     */
    @Bean
    public void producerDelay() {
                String key = "KEY01";
                Map<String, Object> headers = new HashMap<>();
                headers.put(MessageConst.PROPERTY_KEYS, key);
                headers.put(MessageConst.PROPERTY_ORIGIN_MESSAGE_ID, "1001");
                headers.put(MessageConst.PROPERTY_DELAY_TIME_LEVEL, 3);//10秒
                SimpleMsg simpleMsg =  new SimpleMsg();
                simpleMsg.setOrderId("10001");
                Message<SimpleMsg> msg = new GenericMessage(simpleMsg, headers);
                streamBridge.send("producer-out-0", msg);

    }
}

2 消费者

package cn.itbeien.mq;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.context.annotation.Bean;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

/**
 * @author beien
 * @date 2024-06-19 23:05
 * Copyright© 2024 beien
 */
@Service
@Slf4j
public class ConsumerService {

    /**
     * 消费者
     */
    @Bean
    public Consumer<Message<SimpleMsg>> consumer() {
        return msg -> {
            log.info(Thread.currentThread().getName() + " Consumer Receive New Messages: " + msg.getPayload().getOrderId());
        };
    }
}

3 关注我

欢迎关注我的视频号和公众号,视频号有相关技术和业务视频可学习支付业务/文旅行业数字化。探讨技术(系统架构、微服务、容器化、云原生、云原生),支付系统实战。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1847111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SD-WAN为什么适合小企业

SD-WAN&#xff08;软件定义广域网&#xff09;是一种革新性的网络技术&#xff0c;通过软件智能管理&#xff0c;实现灵活和高效的网络连接。在数字化转型浪潮中&#xff0c;企业对网络稳定性和性能的要求不断提升&#xff0c;SD-WAN因此受到了广泛关注。对于资源有限的小型企…

laravel中如何向字段标签添加工具提示

首先&#xff0c;您可以使用 轻松自定义字段标签->label()。我相信您知道这一点。但您知道吗……标签输出未转义&#xff1f;这意味着您也可以在标签中包含 HTML。 为了尽快实现上述目标&#xff0c;我只是采取了一个快速而粗糙的解决方案&#xff1a; CRUD::field(nickna…

扭转引伸计技术资料YYJ-10 6-N

一、 工作原理 利用专门设计的扭转引伸计夹持系统&#xff0c;可靠地装夹在试样上&#xff0c;采用应变片夹式引伸计进行机械量与电信号的转换&#xff0c;使之完成扭转应变的自动测试。 二、技术指标 1、扭转引伸计的标距&#xff1a;该装置分别配置50mm、100mm标距联接延伸横…

一键制作,打造高质量的数字刊物

随着数字化时代的到来&#xff0c;数字刊物已经成为信息传播的重要载体。它以便捷、环保、互动性强等特点&#xff0c;受到了越来越多人的青睐。然而&#xff0c;如何快速、高效地制作出高质量的数字刊物&#xff0c;成为许多创作者面临的难题。今天&#xff0c;教大家一个制作…

浅析MySQL-基础02

目录 MySQL一行记录是怎么存储的&#xff1f; MySQL的数据存放在哪&#xff1f; 表空间文件的结构是怎么样的&#xff1f; InnoDB行格式有哪些&#xff1f; Compact行格式是啥样的&#xff1f; 记录的额外信息 1、变长字段长度列表 2、NULL值列表 3、记录头信息 记录…

LeetCode题练习与总结:克隆图--133

一、题目描述 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node {public int val;public L…

【EndNote】EndNote进行文献管理可能遇到的问题和解决方案

一、安装GB/T7714-2015(numberic)文献style windows&#xff1a;https://blog.csdn.net/qq_36235935/article/details/115629694 mac os&#xff1a;Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)-CSDN博客 安装完之后需要调整Author Name格式&#xff1a;…

Linux内核学习——linux内核体系结构(1)

1 Linux内核模式 学习的是Linux 0.11内核&#xff0c;采用的是单内核模式。单内核模式的主要优点是内核代码结构紧凑、执行速度快&#xff0c;但是层次结构性不强。 操作系统如何提供的服务流程&#xff1f; 应用主程序使用指定的参数值执行系统调用指令(int x80)&#xff0…

用进程和线程完成TCP进行通信操作及广播和组播的通信

进程 代码 #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#includ…

如何使用idea连接Oracle数据库?

idea版本&#xff1a;2021.3.3 Oracle版本&#xff1a;10.2.0.1.0&#xff08;在虚拟机Windows sever 2003 远程连接数据库&#xff09; 数据库管理系统&#xff1a;PLSQL Developer 在idea里面找到database&#xff0c;在idea侧面 选择左上角加号&#xff0c;新建&#xff…

消息队列kafka中间件详解:案例解析(第10天)

系列文章目录 1- 消息队列&#xff08;熟悉&#xff09;2- Kafka的基本介绍&#xff08;掌握架构&#xff0c;其他了解&#xff09;3- Kafka的相关使用&#xff08;掌握kafka常用shell命令&#xff09;4- Kafka的Python API的操作&#xff08;熟悉&#xff09; 文章目录 系列文…

0.15元1.5Mhz-1.3A同步整流BUCK降压DCDC芯片MT3410(MT3410LB)

前言 国产同步整流DCDC&#xff0c;参考价格约0.15元。 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 1.3A 输出电流 无需肖特基二极管 2.3V至7V输入电压范围 输出电压低至 0.6V PFM 模式可在轻负载下实现高效率 压差操作中的100%占空比 低静态电流&#xff1a;35μ…

开放式耳机哪个品牌质量比较好?五大公认性能之王推荐!

作为一名热爱音乐的DJ爱好者&#xff0c;我当然知道一款适合DJ使用的开放式耳机应该具备哪些特点。最近&#xff0c;我深入评测了几款热门开放式耳机&#xff0c;从音质、舒适度、耐用性到混音功能等方面进行了全面评估。今天&#xff0c;我想为大家分享我的评测结果&#xff0…

可视化数据科学平台在信贷领域应用系列六:自动机器学习(上篇)

在现代数据驱动的世界中&#xff0c;机器学习已经成为解决复杂问题和推动创新的重要手段。然而&#xff0c;传统的机器学习模型开发过程复杂且耗时&#xff0c;包括数据预处理、特征工程、模型选择、参数调优和模型评估等多个步骤环节&#xff0c;需要模型开发人员具备丰富的专…

深圳比创达电子|EMC与EMI一站式解决方案:源头到终端的全面防护

随着电子技术的飞速发展&#xff0c;电磁兼容性&#xff08;EMC&#xff09;和电磁干扰&#xff08;EMI&#xff09;问题日益成为产品研发和生产的关键因素。为了帮助企业更好地应对这些挑战。 一、EMC与EMI的基本概述 电磁兼容性&#xff08;EMC&#xff09;是指设备或系统在…

众爱宠物开源项目介绍

众爱宠物管理系统是一个集会员管理、宠物管理、商品管理、库存管理、数据管理、收银管理、多门店管理等功能于一体的综合管理系统&#xff0c;具有操作方便、简单、安全等优点。 开源项目地址

STM32---SPI通信协议(小白入、含源码)

写在前面&#xff1a;在单片机的学习过程中&#xff0c;各种通信协议的学习是必不可少的&#xff0c;在前面我们学习了串口通信、IIC通信&#xff0c;本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是…

“一站式企业服务平台”的功能架构

为提升区域营商环境&#xff0c;为促进区域经济发展&#xff0c;实现资源高效配置&#xff0c;全国各区域政府及产业园区都越来越重视如何创新企业服务机制、提升企业服务水平&#xff0c;来保障区域内的企业稳定及帮扶企业高质量的发展。随着近年来大数据、人工智能等新一代信…

V4和V6双栈处理

现进行双栈 对R1 对R2 对R3 对R4 路由地址配完&#xff0c;起协议 然后起ripng&#xff0c;在R2&#xff0c;R3&#xff0c;R4上都宣告一下 然后在PC1和PC2上都手动配置一下就可以了

对比 Axios 和 Fetch:选择最适合的 HTTP 请求方法

在前端开发中&#xff0c;处理 HTTP 请求是一个常见且重要的任务。JavaScript 提供了多种方式来发送网络请求&#xff0c;其中最受欢迎的两种方式分别就是 Fetch API 和 Axios。尽管两者都能完成同样的任务&#xff0c;即从客户端向服务器发送请求并接收响应&#xff0c;但它们…