Redis 之所以能够用来做发布/订阅(Pub/Sub)功能,主要是因为它提供了内置的 Pub/Sub 机制,允许消息的发布者和订阅者之间实现异步消息传递。下面是 Redis 能够实现 Pub/Sub 的几个关键点:
1. 轻量级、快速的消息传递机制Redis 本质上是一个内存数据库,它的高性能使得它在消息传递中能够提供低延迟的通信。发布者可以立即将消息发布到 Redis 中,而 Redis 以极快的速度将消息推送给所有订阅者。
2. 发布/订阅的工作机制Redis 的 Pub/Sub 模型是一种简单的广播机制,它工作流程如下:
发布者:通过 PUBLISH 命令将消息发送到某个频道(channel)。
订阅者:通过 SUBSCRIBE 命令订阅一个或多个频道。一旦订阅者订阅了某个频道,该订阅者就会接收到该频道发布的所有消息。
1.使用Jedis作为客户端
123456789101112// 发布消息Jedis jedis = new Jedis("localhost");jedis.publish(& ...
title: 动态线程池组件:项目总结date: 2024/9/6categories: 项目tag:
后端开发
组件
项目
线程池cover: https://jsd.onmicrosoft.cn/gh/youdekangkang/blogImage@main/img/image-20240906034412240.png
组件的特点?因为任务会分为CPU密集型以及IO密集型,每一种方案都会需要不同的场景配置,但是你又不能保证所有的配置都是最优值。所以既然不能保证参数配置最合理,那么是否可以通过将修改线程池参数的成本降下来,这样⾄少可以发⽣故障的时候可以快速 调整从⽽缩短故障恢复的时间?基于这个思考,我们可以将线程池的参数从代码中迁移到注册中心上, 实现线程池参数可动态配置和即时⽣效。
为什么要自研线程池?问题1:为什么要自研?
这是很典型的问题,很多人也会比较奇怪为什么放着好的成熟的方案不适用非要自己写一套东西。以下便是自己写组件的好处:
1.满足特定需求: 自研可以更精准地匹配内部业务场景,定制化功能以满足特定的业务需求。 成熟的实现可能无法覆盖所有细 ...
代码概览1234567891011121314151617181920212223242526272829303132333435363738package fun.hyperzhu.middleware.dynamic.thread.pool.sdk.trigger.job;import com.alibaba.fastjson.JSON;import fun.hyperzhu.middleware.dynamic.thread.pool.sdk.domain.IDynamicThreadPoolService;import fun.hyperzhu.middleware.dynamic.thread.pool.sdk.domain.model.entity.ThreadPoolConfigEntity;import fun.hyperzhu.middleware.dynamic.thread.pool.sdk.registry.IRegistry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.sp ...
添加一个Listener的模块
1234567891011121314151617181920212223242526272829public class ThreadPoolConfigAdjustListener implements MessageListener<ThreadPoolConfigEntity> { private Logger logger = LoggerFactory.getLogger(ThreadPoolConfigAdjustListener.class); private final IDynamicThreadPoolService dynamicThreadPoolService; private final IRegistry registry; public ThreadPoolConfigAdjustListener(IDynamicThreadPoolService dynamicThreadPoolService, IRegistry registry) { this ...
工程结构
domain: ThreadPoolConfigEntity 动态线程池配置实体。
trigger:触发器, DynamicThreadPoolController 接收前端⻚⾯发送的数据。
types:设置返回结果类型, Response 。
应用层
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293@Slf4j@RestController()@CrossOrigin("*")@RequestMapping("/api/v1/dynamic/thread/pool/")public class DynamicThreadPoolController { @Resource public Redi ...
本文仅仅用于学习,查看了星球内四月份到今天为止大家遇到的面试题,总结了自己认为有价值的。T1:抽奖前需要先创建一个抽奖订单(创建抽奖单可能扣减账户次数额度),然后真正执行抽奖。「抽奖订单」的设计,相对于「直接扣减账户中的抽奖次数余额」,能够解决什么实际问题?xfg回答:1.抽奖单设计是一种行为记录的流水,有了抽奖单可以做幂等重试,如果后序流程失败了,抽奖单不会被消费,用户可以重新使用抽奖单抽奖。如果是系统随机发奖,还可以系统基于失败的抽奖单自己做重试补偿。这种思想来自于商城下单,有了订单之后才有订单的支付。2.订单的存在可以让流程有了暂停和继续的操作。如果只是直接扣减账户抽奖次数余额,就只会得到执行结果,那么都是即时状态,过后无法追查校准。
T2:为什么不直接使用内存作为缓存而引入Redisxfg回答:
在营销复杂计算场景中,为了提高性能确实会用本地内存 + redis 缓存的方案。但本地内存会有一个问题,就是分布式架构下,在初始和变更数据,需要所有环境保持统一数据,并需要配有动态配置中心来通知更新。需要一定的维护成本。
一般做这类的系统,以及配置类的,是会存redis ...
*注:仅为个人学习以及记录使用
本章主要介绍一下整体项目中需要包含的内容以及需求分析
我们的项目主要是参照市面上的拼多多大转盘、稀土掘金幸运抽奖等营销系统,基于DDD架构开发了抽奖服务平台,用于满足拉新、促活、留存等需求,增加用户粘性。该项目的主要业务是提供权重值抽奖、奖品次数锁等多种差异化的抽奖,针对用户提供个性化抽奖,并开发了返利业务,对用户行为进行反馈,以此来达成促活的需求。
例如这是掘金的抽奖营销系统:
这里整个产品对应的需求流程设计:
给用户创建一个营销账户,存放用户的积分数据。积分可用于抽奖消耗。
返利服务,是基于用户的行为数据,增加各项积分。如用户的对话、充值等。
抽奖,则可以抽取到;积分、体验卡(开OpenAi账户)、增加账户中的模型和次数。
用户(Actor)行为:
用户通过执行一系列操作触发系统中的积分机制,例如点击抽奖、行为操作等。
点击抽奖:
用户点击抽奖按钮后,系统会先检查该用户是否有首次赠送的抽奖次数(一般是首次抽奖奖励)。
如果用户有首赠次数,则直接参与抽奖活动;如果没有,用户则会通过其他方式获取抽奖次数。
抽奖活动参与:
生成抽奖活动参 ...
需要继续创建一个测试模块
创建两个线程的配置
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051@Slf4j@EnableAsync@Configuration@EnableConfigurationProperties(ThreadPoolConfigProperties.class)public class ThreadPoolConfig { @Bean("threadPoolExecutor01") public ThreadPoolExecutor threadPoolExecutor01(ThreadPoolConfigProperties properties) { // 实例化策略 RejectedExecutionHandler handler; switch (properties.getPolicy()){ ...
需要新建一个spring-boog starter的模块
导入依赖
Google Guava ( com.google.guava:guava ): 这是一个由 Google 提供的核心库,包含了 大量的谷歌核心库,如集合、缓存、原生类型支持、并发库、通用注解、字符串处理、 I/O 等等。版本 32.1.3-jre 是针对 Java 运行时环境的特定版本。
Apache Commons Lang ( commons-lang:commons-lang ): 提供了一系列帮助处理 Java 核 心 API 不足之处的工具类,如字符串操作、反射、并发、数学等。版本 的一个稳定版本。
Apache Commons Codec ( 2.6 是这个库 commons-codec:commons-codec ): 提供了一些通用的编码解 码算法,如 Base64、Hex、MD5、SHA 等。版本 1.15 包含了最新的算法实现和性能 改进。
Alibaba Fastjson ( com.alibaba:fastjson ): 这是一个高性能的 JSON 库,支持将 Java ...