消息消费 topic 和 groupId的关系

在MQ或Kafka中,topic代表消息群,groupId用于标识消费者组。同一组内的消费者共享锚点,确保消息不重复消费;不同组则形成消费隔离。如果A、B系统订阅相同topic但groupId一致,可能导致A消费后B无法消费;若使用不同groupId,则实现消费隔离。

拿MQ 或者kafka举例:

topic 代表一个消息群,

1.如果你是一个项目,但是部署多台服务,那么你作为消费者订阅topic 你得保证你多台服务共用同一个锚点 锚点就是groupId, 那你的消费者配置都得是同一个topic 和同一个groupid

2.锚点groupId的作用, 就是告诉你从哪里开始消费,比如A系统订阅topicA B系统也定于topicA

A系统先订阅了几天, B系统再去订阅 他们的groupId一致,会导致A消费了 B消费不到,

但是如果将消费广播道 同一个topic 和不用的groupidA和groupidB  消费者A和B分别配置groupidA和groupidB  那就形成了隔离 这就是锚点groupId的作用

/** * 注册广播事件处理器(带死信队列配置) * * @param topic 订阅的主题名称 * @param handler 事件处理器实例 * @param executor 业务处理线程池 * @param dlqConfig 死信队列配置 */ public void registerBroadcast(@Nonnull String topic, @Nonnull EventHandler handler, @Nonnull ExecutorService executor, @Nonnull DLQConfig dlqConfig) { String groupId = idGenerator.createGroupId(topic); registerUnicast(topic, groupId, handler, executor, null, dlqConfig); } /** * 注册处理广播事件的handler groupId使用UUID随机生成,确保唯一性。 * * @param topic 主题 * @param handler 事件处理类 * @param executorService 上层传递的处理业务的线程池 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerBroadcast(@Nonnull String topic, @Nonnull EventHandler handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode) { String groupId = idGenerator.createGroupId(topic); registerUnicast(topic, groupId, handler, executorService, partitionAssignorMode); } /** * 注册广播事件处理器(自定义分区策略+死信队列) * * @param topic 订阅的主题名称 * @param handler 事件处理器实例 * @param executorService 业务处理线程池 * @param partitionAssignorMode 分区分配策略 * @param dlqConfig 死信队列配置 */ public void registerBroadcast(@Nonnull String topic, @Nonnull EventHandler handler, @Nonnull ExecutorService executorService, @Nonnull PartitionAssignorMode partitionAssignorMode, @Nonnull DLQConfig dlqConfig) { String groupId = idGenerator.createGroupId(topic); registerUnicast(topic, groupId, handler, executorService, partitionAssignorMode, dlqConfig); } /** * 注册处理单播事件的handler 一个topic对应一个consumerId * * @param topic 主题 * @param groupId 消费者组Id,在同一个组消费者实现单播消费 * @param handler 事件处理类 * @param executor 上层传递的用于业务处理的线程池 */ @Override public void registerUnicast(@Nonnull String topic, @Nonnull String groupId, @Nonnull EventHandler handler, @Nonnull ExecutorService executor) { registerUnicast(topic, groupId, handler, executor, (PartitionAssignorMode) null); } /** * 注册单播事件处理器(带死信队列配置) * * @param topic 订阅的主题名称 * @param groupId 消费者组ID * @param handler 事件处理器实例 * @param executor 业务处理线程池 * @param dlqConfig 死信队列配置 */ public void registerUnicast(@Nonnull String topic, @Nonnull String groupId, @Nonnull EventHandler handler, @Nonnull ExecutorService executor, @Nonnull DLQConfig dlqConfig) { registerUnicast(topic, groupId, handler, executor, null,dlqConfig); } /** * 注册处理单播Topic消息的handler, * * @param topic 主题 * @param groupId 消费者组Id * @param handler 事件处理类 * @param executorService 上层传递的处理业务的线程池 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerUnicast(@Nonnull String topic, @Nonnull String groupId, @Nonnull EventHandler handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode) { partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); register(topic, groupId, handler, executorService, partitionAssignorMode); } /** * 注册单播事件处理器(自定义分区策略+死信队列) * * @param topic 订阅的主题名称 * @param groupId 消费者组ID * @param handler 事件处理器实例 * @param executorService 业务处理线程池 * @param partitionAssignorMode 分区分配策略 * @param dlqConfig 死信队列配置 */ public void registerUnicast(@Nonnull String topic, @Nonnull String groupId, @Nonnull EventHandler handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode, @Nonnull DLQConfig dlqConfig) { partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); EventHandler wrappedHandler = new DLQEventHandlerWrapper(handler, dlqConfig, topic,this); register(topic, groupId, wrappedHandler, executorService, partitionAssignorMode); } /** * 注册处理广播Topic消息的无业务线程池的Handler * * @param topic 主题 * @param handler 事件处理类 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerBroadcastWithoutThreadPool(@Nonnull String topic, @Nonnull EventHandler handler, PartitionAssignorMode partitionAssignorMode) { String groupId = idGenerator.createGroupId(topic); registerUnicastWithoutThreadPool(topic, groupId, handler, partitionAssignorMode); } /** * 注册无线程池的广播处理器(自定义分区策略+死信队列) * * @param topic 订阅的主题名称 * @param handler 事件处理器实例 * @param partitionAssignorMode 分区分配策略 * @param dlqConfig 死信队列配置 */ public void registerBroadcastWithoutThreadPool(@Nonnull String topic, @Nonnull EventHandler handler, @Nonnull PartitionAssignorMode partitionAssignorMode, @Nonnull DLQConfig dlqConfig) { String groupId = idGenerator.createGroupId(topic); registerUnicastWithoutThreadPool(topic, groupId, handler, partitionAssignorMode, dlqConfig); } /** * 注册处理单播Topic消息的无业务线程池的Handler * * @param topic 主题 * @param groupId 消费者组 * @param handler 事件处理类 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerUnicastWithoutThreadPool(@Nonnull String topic, @Nonnull String groupId, @Nonnull EventHandler handler, PartitionAssignorMode partitionAssignorMode) { partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); register(topic, groupId, handler, null, partitionAssignorMode); } /** * 注册无线程池的单播处理器(自定义分区策略+死信队列) * * @param topic 订阅的主题名称 * @param groupId 消费者组ID * @param handler 事件处理器实例 * @param partitionAssignorMode 分区分配策略 * @param dlqConfig 死信队列配置 */ public void registerUnicastWithoutThreadPool(@Nonnull String topic, @Nonnull String groupId, @Nonnull EventHandler handler, @Nonnull PartitionAssignorMode partitionAssignorMode, @Nonnull DLQConfig dlqConfig) { partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); // 包装Handler,添加DLQ逻辑 EventHandler wrappedHandler = new DLQEventHandlerWrapper(handler, dlqConfig, topic,this); // 调用核心注册(executorService传null,无线程池) register(topic, groupId, wrappedHandler, null, partitionAssignorMode); }以上是我已经完成带死信重载的注册方法,请仿照我的方法修改后续注册方法 @Override public <T> void registerBroadcastGenerically(@Nonnull String topic, @Nonnull GenericEventHandler<T> handler, @Nonnull ExecutorService executor, @NonNull Class<T> clazz) { String groupId = idGenerator.createGroupId(topic); registerUnicastGenerically(topic, groupId, handler, executor, clazz); } /** * 注册处理广播事件的handler groupId使用UUID随机生成,确保唯一性。 * * @param topic 主题 * @param handler 事件处理类 * @param executorService 上层传递的处理业务的线程池 * @param partitionAssignorMode 分区分配策略 */ @Override public <T> void registerBroadcastGenerically(@Nonnull String topic, @Nonnull GenericEventHandler<T> handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode, @NonNull Class<T> clazz) { String groupId = idGenerator.createGroupId(topic); registerUnicastGenerically(topic, groupId, handler, executorService, partitionAssignorMode, clazz); } /** * 注册处理单播事件的handler 一个topic对应一个consumerId * * @param topic 主题 * @param groupId 消费者组Id,在同一个组消费者实现单播消费 * @param handler 事件处理类 * @param executor 上层传递的用于业务处理的线程池 */ @Override public <T> void registerUnicastGenerically(@Nonnull String topic, @Nonnull String groupId, @Nonnull GenericEventHandler<T> handler, @Nonnull ExecutorService executor, @NonNull Class<T> clazz) { registerUnicastGenerically(topic, groupId, handler, executor, null, clazz); } /** * 注册处理单播Topic消息的handler, * * @param topic 主题 * @param groupId 消费者组Id * @param handler 事件处理类 * @param executorService 上层传递的处理业务的线程池 * @param partitionAssignorMode 分区分配策略 */ @Override public <T> void registerUnicastGenerically(@Nonnull String topic, @Nonnull String groupId, @Nonnull GenericEventHandler<T> handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode, @NonNull Class<T> clazz) { partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); register(topic, groupId, handler, executorService, partitionAssignorMode, clazz, SerializeEnum.JSON); } /** * 注册处理广播Topic消息的无业务线程池的Handler * * @param topic 主题 * @param handler 事件处理类 * @param partitionAssignorMode 分区分配策略 */ @Override public <T> void registerBroadcastWithoutThreadPoolGenerically(@Nonnull String topic, @Nonnull GenericEventHandler<T> handler, PartitionAssignorMode partitionAssignorMode, @NonNull Class<T> clazz) { String groupId = idGenerator.createGroupId(topic); registerUnicastWithoutThreadPoolGenerically(topic, groupId, handler, partitionAssignorMode, clazz); } /** * 注册处理单播Topic消息的无业务线程池的Handler * * @param topic 主题 * @param groupId 消费者组 * @param handler 事件处理类 * @param partitionAssignorMode 分区分配策略 */ @Override public <T> void registerUnicastWithoutThreadPoolGenerically(@Nonnull String topic, @Nonnull String groupId, @Nonnull GenericEventHandler<T> handler, PartitionAssignorMode partitionAssignorMode, @NonNull Class<T> clazz) { partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); register(topic, groupId, handler, null, partitionAssignorMode, clazz, SerializeEnum.JSON); }@Override public void registerBroadcast(@Nonnull String topic, @Nonnull GenericEventHandler handler, @Nonnull ExecutorService executor, @Nonnull SerializeEnum serializeEnum) { switch (serializeEnum) { case KRYO: String groupId = idGenerator.createGroupId(topic); registerUnicast(topic, groupId, handler, executor, serializeEnum); break; case JSON: default: registerBroadcastGenerically(topic, handler, executor, EventV2.class); break; } } /** * 注册处理广播事件的handler groupId使用UUID随机生成,确保唯一性。 * * @param topic 主题 * @param handler 事件处理类 * @param executorService 上层传递的处理业务的线程池 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerBroadcast(@Nonnull String topic, @Nonnull GenericEventHandler handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode, @Nonnull SerializeEnum serializeEnum) { switch (serializeEnum) { case KRYO: String groupId = idGenerator.createGroupId(topic); registerUnicast(topic, groupId, handler, executorService, partitionAssignorMode, serializeEnum); break; case JSON: default: registerBroadcastGenerically(topic, handler, executorService, partitionAssignorMode, EventV2.class); break; } } /** * 注册处理单播事件的handler 一个topic对应一个consumerId * * @param topic 主题 * @param groupId 消费者组Id,在同一个组消费者实现单播消费 * @param handler 事件处理类 * @param executor 上层传递的用于业务处理的线程池 */ @Override public void registerUnicast(@Nonnull String topic, @Nonnull String groupId, @Nonnull GenericEventHandler handler, @Nonnull ExecutorService executor, @Nonnull SerializeEnum serializeEnum) { switch (serializeEnum) { case KRYO: registerUnicast(topic, groupId, handler, executor, null, serializeEnum); break; case JSON: default: registerUnicastGenerically(topic, groupId, handler, executor, null, EventV2.class); break; } } /** * 注册处理单播Topic消息的handler, * * @param topic 主题 * @param groupId 消费者组Id * @param handler 事件处理类 * @param executorService 上层传递的处理业务的线程池 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerUnicast(@Nonnull String topic, @Nonnull String groupId, @Nonnull GenericEventHandler handler, @Nonnull ExecutorService executorService, PartitionAssignorMode partitionAssignorMode, @Nonnull SerializeEnum serializeEnum) { switch (serializeEnum) { case KRYO: partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); register(topic, groupId, handler, executorService, partitionAssignorMode, EventV2.class, SerializeEnum.KRYO); break; case JSON: default: registerUnicastGenerically(topic, groupId, handler, executorService, partitionAssignorMode, EventV2.class); break; } } /** * 注册处理广播Topic消息的无业务线程池的Handler * * @param topic 主题 * @param handler 事件处理类 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerBroadcastWithoutThreadPool(@Nonnull String topic, @Nonnull GenericEventHandler handler, PartitionAssignorMode partitionAssignorMode, @Nonnull SerializeEnum serializeEnum) { switch (serializeEnum) { case KRYO: String groupId = idGenerator.createGroupId(topic); registerUnicastWithoutThreadPool(topic, groupId, handler, partitionAssignorMode, serializeEnum); break; case JSON: default: registerBroadcastWithoutThreadPoolGenerically(topic, handler, partitionAssignorMode, EventV2.class); break; } } /** * 注册处理单播Topic消息的无业务线程池的Handler * * @param topic 主题 * @param groupId 消费者组 * @param handler 事件处理类 * @param partitionAssignorMode 分区分配策略 */ @Override public void registerUnicastWithoutThreadPool(@Nonnull String topic, @Nonnull String groupId, @Nonnull GenericEventHandler handler, PartitionAssignorMode partitionAssignorMode, @Nonnull SerializeEnum serializeEnum) { switch (serializeEnum) { case KRYO: partitionAssignorMode = getPartitionAssignorMode(topic, groupId, partitionAssignorMode); register(topic, groupId, handler, null, partitionAssignorMode, EventV2.class, SerializeEnum.JSON); break; case JSON: default: registerUnicastWithoutThreadPoolGenerically(topic, groupId, handler, partitionAssignorMode, EventV2.class); break; } }
最新发布
10-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值