小项目的不甘(基于redis的消息队列)

简介: 过往项目涉及到的技术和中间件主要有springboot+mysql+redis等,其中的一个文书的生成环节,涉及到的操作过多(文书生成(从xml->doc->pdf),文书信息入库,模版状态的更改、操作日志记录等等),导致测试在进行压测(50/S,100/S,200/S)的时候,接口执行时间过长🤓,以此进行优化。

一、背景

同样是在海口的项目的文书平台,项目涉及到的技术和中间件主要有springboot+mysql+redis等,其中的一个文书的生成环节,涉及到的操作过多(文书生成(从xml->doc->pdf),文书信息入库,模版状态的更改、操作日志记录等等),导致测试在进行压测(50/S,100/S,200/S)的时候,接口执行时间过长🤓,所以要进行优化。

二、优化路线

对于CRUD的语句优化得不能再优化后,主要耗时的部分在于模版转化文书的过程(从xml->doc->pdf),在确保每条sql执行不会出现异常情况下(除非宕机),将流程拆分为异步处理(主要的削峰)。由于是分布式的情况下,单体应用的队列就不考虑了,所以考虑到的是阿里的RocketMQ,其中的消息顺序消费也是符合需求的。但海口的其它项目组并没有使用到MQ,又不能自己申请一个😫,加上个人不太在项目引入过多的中间件(运维成本和项目风险),现在能使用的也就Redis,而且之前引入Redisson,所以采用了Redisson的消息队列。


三、集成Redisson消息队列

1、引入redisson(跟上篇一样🙄)

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>版本号</version></dependency>


2、redisson配置

@Configuration@EnableAutoConfigurationpublicclassRedissonConfig {
@Value("${spring.redis.host}")
privateStringhost;
@Value("${spring.redis.port}")
privateStringport;
@Value("${spring.redis.password}")
privateStringpassword;
@BeanpublicRedissonClientgetRedisson() {
Configconfig=newConfig();
config.useSingleServer()
                .setAddress("redis://"+host+":"+port)
                .setTcpNoDelay(true)
                .setConnectTimeout(30000)
                .setSubscriptionsPerConnection(5)
                .setKeepAlive(true)
                .setSubscriptionConnectionPoolSize(50)
                .setPingConnectionInterval(60000);
// 添加主从配置// config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""});returnRedisson.create(config);
    }
}


3、主要代码块

执行器

@Component@Order(3)
publicclassQueueRunnerimplementsCommandLineRunner {
privateExecutorServicequeueThreadPool=newThreadPoolExecutor(4,
8,
1000,
TimeUnit.MILLISECONDS,
newLinkedBlockingDeque<>(8),
newThreadPoolExecutor.CallerRunsPolicy());
@AutowiredQueueHandlerqueueHandler;
@Overridepublicvoidrun(String... args) {
queueThreadPool.execute(queueHandler);
    }
}



监听器

@Getter@Setter@ComponentpublicclassQueueHandlerimplementsRunnable {
@ResourceRedissonClientredissonClient;
@Overridepublicvoidrun() {
// 添加topic监听RTopictopic=redissonClient.getTopic(CommonConstant.REDISSION_SYS_TOPIC, newSerializationCodec());
topic.addListener(SystemMessage.class, (CharSequencecharSequence, SystemMessagereportMessage) -> {
executeTask(reportMessage);
        });
    }
/*** 处理队列信息* 由于队列是异步的,无法获取SessionUtils的用户信息,需要手动回传** @param systemMessage*/privatevoidexecuteTask(SystemMessagesystemMessage) {
switch (systemMessage.getModelEnum()) {
casePARAMS:
// 业务逻辑break;
default:
break;
        }
    }
// 省略。。。}


四、压测结果

经过采用异步处理,文书生成接口通过测试的压测(50/S,100/S,200/S)。


五、没demo,参考资料

https://blog.csdn.net/u011663149/article/details/88855849

https://blog.csdn.net/CharlesYooSky/article/details/101701690

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
22天前
|
消息中间件 存储 负载均衡
Redis使用ZSET实现消息队列使用总结二
Redis使用ZSET实现消息队列使用总结二
44 0
|
5天前
|
消息中间件 NoSQL Redis
Redis Stream消息队列之基本语法与使用方式
这篇文章详细介绍了Redis Stream消息队列的基本语法和使用方式,包括消息的添加、读取、删除、修剪以及消费者组的使用和管理,强调了其在消息持久化和主备复制方面的优势。
18 0
|
2月前
|
存储 NoSQL Java
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
|
22天前
|
消息中间件 存储 NoSQL
Redis使用ZSET实现消息队列使用总结一
Redis使用ZSET实现消息队列使用总结一
37 0
|
22天前
|
消息中间件 物联网 API
消息队列 MQ使用问题之如何在物联网项目中搭配使用 MQTT、AMQP 与 RabbitMQ
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
1月前
|
消息中间件 Java 中间件
如何在Java项目中实现高效的消息队列系统
如何在Java项目中实现高效的消息队列系统
|
1月前
|
前端开发 JavaScript NoSQL
软件开发常见流程之若依项目修改,前后端本地启动,本地必须有Redis+Navicate启动数据库
软件开发常见流程之若依项目修改,前后端本地启动,本地必须有Redis+Navicate启动数据库
|
1月前
|
存储 缓存 NoSQL
网页设计,若依项目修改(It must be done)04在线用户展示---仅仅从Redis取一下数据做展示,查看若依存储的资料,用RDM
网页设计,若依项目修改(It must be done)04在线用户展示---仅仅从Redis取一下数据做展示,查看若依存储的资料,用RDM
|
2月前
|
NoSQL Redis 数据安全/隐私保护
大事件后端项目35——登录优化_redis_主动失效机制实现
大事件后端项目35——登录优化_redis_主动失效机制实现
|
消息中间件 NoSQL Redis
Redis 消息队列介绍
Redis的消息队列使用简单,没有什么配置,比ActiveMQ要轻量级太多,当然功能也比较简单,如果只需要简单的订阅以及发布,可以考虑使用它。 **订阅操作** 命令为:subscribe [channel] [channel] ..,如【代码1】所示,即成功订阅频道[redis.blog]。 **发布操作** 命令为publish [channel] [message],
4404 0

热门文章

最新文章