JAVA整合阿里云ONS(RocketMQ)

前言

关于阿里云ONS我这里不多介绍,用的话直接去看官网,这里提几个实际对接的问题
问题一:
TCP版的不支持本地调试,只支持公网链接
在这里插入图片描述

问题二:
ONS不支持批量消息
在这里插入图片描述
问题三:
ONS延迟消息的时间是可以自定义的,其内部实现和RocketMQ是不同的,这个可以查看往期文章RocketMQ-延迟消息

整合

关于ONS的API使用,其实并不是本文的重点,这个看看官方文档就行了阿里云ONS
在这里插入图片描述
那么本文的重点在于整合,阿里云的ONS其实收费还是挺高的,有一条收费条款是API消耗,这个有点划不来,我们知道消费者需要拉消息消费,那么按道理来说有消息就算消息么,这也没问题,但是ONS既然把没有消息是consumer的长轮询(ONS是15S一次),这个也算API消耗,而且Topic越多,消费者越多,消耗是成指数级别增长的,那么为了降低成本,我们可以在测试环境,开发环境上不适用ONS,测试、开发环境我们可以自己搭建RocketMQ,那么这样我们就可以降低一些成本,这里ONS对接使用的是ons-client,而RocketMQ使用的是(rocketmq-client或者rocketmq-spring-boot-starter)那么这里就是两套API了,其API的实现,调用,配置,是有很大的区别,所以这里要在不同的环境使用不同的client工具,生产环境使用ONS,测试环境、开发环境使用RocketMQ,根据不同的环境自动切换client对接API,那么这里就需要对这两套client工具进行整合。首先我们整合需要先了解ocketmq-client和rocketmq-spring-boot-starter有哪些API,其内部实现是怎么样的,过去关于这里已经写好文章,做好铺垫了见往期文章JAVA使用rocketmq-client整合RocketMQspringboot使用rocketmq-spring-boot-starter整合RocketMQ,这里整合的思路是按照rocketmq-spring-boot-starter的设计思路,产考rocketmq-spring-boot-starter的API实现,这里就是为了方便使用者在会使用rocketmq-spring-boot-starter的前提下,无序太多看文档,就能使用这套整合好的客户端工具,在生产者这方面,和rocketmq-spring-boot-starter是大相径庭的,消费者方面也是大相径庭的!

源码讲解

项目目录
在这里插入图片描述

核心依赖

		<dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun.openservices</groupId>
            <artifactId>ons-client</artifactId>
            <version>1.8.0.Final</version>
        </dependency>

自动注入
在这里插入图片描述
配置文件映射
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
配置文件,这里有两个,一个是ONS另一个是RocketMQ的,那么这里就可以根据type根据启动环境自动切换

消费者端

/**
 * @description: NbMq-Producer自动注入
 * @author TAO
 * @date 2021/12/20 7:03 下午
 */

@Configuration
@EnableConfigurationProperties(NbMqProperties.class)
public class NbAutoProducerConfiguration {


    /**
     * 根据type初始化对应的Producer
     * @param properties
     * @return
     */
    @Bean
    @ConditionalOnProperty(prefix = "rmq.producer", name = "producerId")
    public NbMqProducer nbMqProducer(NbMqProperties properties) throws MQClientException {
        String type = properties.getType();
        if ("rocket".equals(type)){
            return new RocketMqProducer(properties);
        }else if ("ons".equals(type)){
            return new OnsMqProducer(properties);
        }else{
            throw new RuntimeException("请提供正确的MQ客户端类型 , 如 : rocket / ons");
        }
    }


}

更具type创建不同的client,以下是RocketMQ
在这里插入图片描述
生产者其实特别简单的,就是顶层抽象出一个NbMqProducer接口,然后根据不同的type创建不同的client

生产者调用
在这里插入图片描述
消费者端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消费者注解
在这里插入图片描述
消费者监听接口
在这里插入图片描述

消费者调用
在这里插入图片描述

消费者生产者自动注入

在这里插入图片描述
后续更加完善后会将这个starter开源出来

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
1、MQ场景     1)订单异步解耦     2)解决分布式事务问题     3)应用于聊天平台     4)大规模机器的Cache同步     5)MySQL BinLog订阅数据分发 2、ONS应用场景     异步、解耦、最终一致、并行 3、设计假定     1)每台PC机器都可能down机不可服务     2)任意集群都可能处理能力不足     3)最坏情况一定会发生     4)内网环境需要低延迟来提供你最佳用户体验 4、关键设计     1)分布式集群化         a、理论上无限处理能力         b、集群级别高可用     2)强数据安全         a、单机磁盘级别冗余         b、单组多队列级别冗余         c、多组消息队列冗余     3)海量数据堆积         a、推模式:订阅者逻辑简单         b、拉模式:关注吞吐量,快         c、推拉结合:队列通知消费者,消费者去拉取(两次交互)         d、阿里采用长连接和轮询:轮询去拉,有则拉取,无则保持长连接等待,直到有消息     4)毫秒级投递延迟 5、关键概念     1)Topic:第一级消息类型,主标题     2)Tug:第二级消息类型,分标题     3)发送组:生产者所在集群     4)订阅组:消费者所在集群     5)RocketMQ不是一对一,也不是一对多,是随机一对一     6)网络三种状态:成功、失败、没响应 6、消息乱序问题:Message服务器不处理,恰好不需要解决     1)发送时对消息进行编号     2)一组消息只有唯一一个订阅者处理(sharding)     3)一组消息的数量(即“锁的颗粒度”)越小越好 7、消息重复问题     1)重复原因:网络不可达     2)幂等:某个操作无论重复多少次,结果都一样(不需要解决,性能极高)     3)非幂等,去重         a、保证有个唯一ID标记每一条消息;         b、保证消息处理成功与去重表日志同时出现     4)去重代价:额外的tps和qps 8、事务的分布式优化     1)事务1-->MQ Server-->事务2     2)同时成功,同时失败:         a、发消息;         b、执行事务1;         c、确认消息发送;         d、投递消息到消费者     3)处理超时问题(重复):事务2增加消息确认表(去重表)     4)消息失败(事务2失败):记录后人工处理(小概率事件)
AMQP(Advanced Message Queuing Protocol)是一种高级消息队列协议,用于在应用程序之间传递消息。阿里云提供了AMQP的Java SDK,使得Java应用程序可以轻松地与阿里云的消息队列服务(MQ)进行通信。 以下是使用阿里云AMQP Java SDK进行消息队列操作的基本步骤: 1. 引入AMQP Java SDK依赖 ```xml <dependency> <groupId>com.aliyun</groupId> <artifactId>ons-client</artifactId> <version>1.12.3</version> </dependency> ``` 2. 创建阿里云MQ实例 ```java Properties properties = new Properties(); properties.setProperty(PropertyKeyConst.ProducerId, producerId); properties.setProperty(PropertyKeyConst.AccessKey, accessKey); properties.setProperty(PropertyKeyConst.SecretKey, secretKey); properties.setProperty(PropertyKeyConst.ONSAddr, onsAddr); Producer producer = ONSFactory.createProducer(properties); producer.start(); ``` 3. 发送消息 ```java Message message = new Message(topic, tag, body.getBytes()); SendResult sendResult = producer.send(message); ``` 4. 接收消息 ```java Properties properties = new Properties(); properties.setProperty(PropertyKeyConst.ConsumerId, consumerId); properties.setProperty(PropertyKeyConst.AccessKey, accessKey); properties.setProperty(PropertyKeyConst.SecretKey, secretKey); properties.setProperty(PropertyKeyConst.ONSAddr, onsAddr); Consumer consumer = ONSFactory.createConsumer(properties); consumer.subscribe(topic, tag, new MessageListener() { @Override public Action consume(Message message, ConsumeContext context) { String body = new String(message.getBody()); System.out.println("Received message: " + body); return Action.CommitMessage; } }); consumer.start(); ``` 以上是使用阿里云AMQP Java SDK进行消息队列操作的基本步骤。需要注意的是,生产者和消费者需要使用相同的属性(如producerId、consumerId、accessKey、secretKey、onsAddr、topic、tag等)才能正常通信。同时,阿里云还提供了更多高级功能,如事务消息、定时消息、顺序消息等。详情请参考阿里云MQ官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员劝退师-TAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值