项目实战之RabbitMQ冗余双写架构

🧑‍💻作者名称:DaenCode

🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。

😎人生感悟:尝尽人生百味,方知世间冷暖。

📖所属专栏:项目所感所想



文章目录

🌟架构图

🌟application.properties

xml 复制代码
redundancy.mq.redundancy-event-exchange=redundancy.event.exchange
redundancy.mq.add-routing-key=redundancy.add.business.consumer.routing.key
redundancy.mq.add-business-binding-key=redundancy.add.business.*.routing.key
redundancy.mq.add-consumer-binding-key=redundancy.add.*.consumer.routing.key
redundancy.mq.add-business-queue=redundancy.add.business.queue
redundancy.mq.add-consumer-queue=redundancy.add.consumer.queue

🌟RabbitMQ配置

java 复制代码
package top.daencode.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Copyright (C) 2023-11-29  智源恩创网络科技工作室
 *
 * @BelongsProject: architecture-solution
 * @BelongsPackage: top.daencode.mq
 * @author: DaenCode
 * @createTime: 2023-11-29  15:08
 * @description: TODO
 * @version: 1.0
 */
@Configuration
@Slf4j
@Data
@ConfigurationProperties(prefix = "redundancy.mq")
public class RabbitMqForRedundancyConfig {
    /**
     * 交换机
     */
    private String redundancyEventExchange;
    /**
     * 添加路由key
     */
    private String addRoutingkey;
    /**
     * B端添加绑定key
     */
    private String addBusinessBindingKey;
    /**
     * C端添加绑定key
     */
    private String addConsumerBindingKey;
    /**
     * B端添加队列
     */
    private String addBusinessQueue;
    /**
     * C端添加队列
     */
    private String addConsumerQueue;

    /**
     * 创建冗余双写交换机
     * @return
     */
    @Bean
    public Exchange redundancyEventExchange(){
        return new TopicExchange(redundancyEventExchange);
    }

    /**
     * 创建B端添加队列
     * @return
     */
    @Bean
    public Queue addBusinessQueue(){
        return new Queue(addBusinessQueue,true,false,false);
    }

    /**
     * 创建C端添加队列
     * @return
     */
    @Bean
    public Queue addConsumerQueue(){
        return new Queue(addConsumerQueue,true,false,false);
    }
    /**
     * B端绑定关系
     */
    @Bean
    public Binding addBusinessBinding(){
        return new Binding(addBusinessQueue, Binding.DestinationType.QUEUE,redundancyEventExchange,
                addBusinessBindingKey,null);
    }

    /**
     * C端交换机绑定到队列
     * @return
     */
    @Bean
    public Binding addConsumerBinding(){
        return new Binding(addConsumerQueue, Binding.DestinationType.QUEUE,redundancyEventExchange,
                addConsumerBindingKey,null);
    }
}

🌟消息协议封装

java 复制代码
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EventMessage implements Serializable {
    /**
     * 消息队列id
     */
    private String messageId;

    /**
     * 事件类型
     */
    private String eventMessageType;

    /**
     * 业务id
     */
    private String bizId;

    /**
     * 消息体
     */
    private String content;

    /**
     * 异常备注
     */
    private String remark;
}

🌟消息类型封装

java 复制代码
public enum EventMessageTypeEnum {
    REDUNDANCY_ADD,
    REDUNDANCY_ADD_BUSINESS,
    REDUNDANCY_ADD_CONSUMER,
    REDUNDANCY_DEL,
    REDUNDANCY_DEL_BUSINESS,
    REDUNDANCY_DEL_CONSUMER,
    REDUNDANCY_UPDATE,
    REDUNDANCY_UPDATE_BUSINESS,
    REDUNDANCY_UPDATE_CONSUMER,
}

🌟C端消费者

java 复制代码
@Component
@Slf4j
@RabbitListener(queuesToDeclare = {@Queue("redundancy.add.consumer.queue")})
public class RedundancyAddConsumerMQListener {
    @Autowired
    private DetailService detailService;
    /**
     * 消费消息
     * @param eventMessage
     * @param message
     * @param channel
     */
    @RabbitHandler
    public void handleAddConsumer(EventMessage eventMessage, Message message, Channel channel){
        try {
            eventMessage.setEventMessageType(EventMessageTypeEnum.REDUNDANCY_ADD_CONSUMER.name());
            boolean flag= detailService.handleAddDetail(eventMessage);
        } catch (Exception e) {
            log.error("handleAddConsumer--消费失败{}",eventMessage);
        }
    }
}

🌟B端消费者

java 复制代码
@Component
@Slf4j
@RabbitListener(queuesToDeclare = {@Queue("redundancy.add.business.queue")})
public class RedundancyAddBusinessMQListener {
    @Autowired
    private DetailService detailService;
    /**
     * 消费消息
     * @param eventMessage
     * @param message
     * @param channel
     */
    @RabbitHandler
    public void handleAddBusiness(EventMessage eventMessage, Message message, Channel channel){
        try {
            eventMessage.setEventMessageType(EventMessageTypeEnum.REDUNDANCY_ADD_BUSINESS.name());
            boolean flag= detailService.handleAddDetail(eventMessage);
        } catch (Exception e) {
            log.error("handleAddBusiness--消费失败{}",eventMessage);
        }
    }
}

🌟发送消息与处理消息

java 复制代码
   /**
     * 发送新增消息
     * @param detailRequest
     */
    @Override
    public void addDetail(DetailRequest detailRequest) {
        detailRequest.setBId(IDUtil.generateRandomNumber(5));
        detailRequest.setCId(IDUtil.generateRandomNumber(5));
        //构造消息
        EventMessage eventMessage = EventMessage.builder()
                .messageId(IDUtil.generateRandomNumber(5).toString())
                .content(JsonUtil.obj2Json(detailRequest))
                .eventMessageType(EventMessageTypeEnum.REDUNDANCY_ADD.name())
                .build();
        rabbitTemplate.convertAndSend(rabbitMqForRedundancyConfig.getRedundancyEventExchange(),
                rabbitMqForRedundancyConfig.getAddRoutingkey(),eventMessage);
    }
//处理新增消息
@Override
    public boolean handleAddDetail(EventMessage eventMessage) {
        String messageType= eventMessage.getEventMessageType();
        DetailRequest detailRequest=JsonUtil.json2Obj(eventMessage.getContent(), DetailRequest.class);
        if (messageType.equals(EventMessageTypeEnum.REDUNDANCY_ADD_CONSUMER.name())){
            CDetailDO cDetailDOIndb=cDetailMapper.selectOne(new QueryWrapper<CDetailDO>()
                    .eq("c_id",detailRequest.getCId())
                    .eq("detail",detailRequest.getDetail()));
            if (cDetailDOIndb==null){
                CDetailDO cDetailDO = CDetailDO.builder()
                        .bId(detailRequest.getBId())
                        .cId(detailRequest.getCId())
                        .detail(detailRequest.getDetail())
                        .build();
                cDetailMapper.insert(cDetailDO);
            }else {
                log.error("handleAddDetail---REDUNDANCY_ADD_CONSUMER重复{}",eventMessage);
            }
        } else if (messageType.equals(EventMessageTypeEnum.REDUNDANCY_ADD_BUSINESS.name())) {
            BDetailDO bDetailDOIndb=bDetailMapper.selectOne(new QueryWrapper<BDetailDO>()
                    .eq("b_id",detailRequest.getCId())
                    .eq("detail",detailRequest.getDetail()));
            if (bDetailDOIndb==null){
                BDetailDO bDetailDO = BDetailDO.builder()
                        .bId(detailRequest.getBId())
                        .cId(detailRequest.getCId())
                        .detail(detailRequest.getDetail())
                        .build();
                bDetailMapper.insert(bDetailDO);
            }else {
                log.error("handleAddDetail---REDUNDANCY_ADD_BUSINESS重复{}",eventMessage);
            }
        }
        return false;
    }

🌟最后

最后,感谢大家对本文的阅读,希望对大家有帮助。


相关推荐
ACP广源盛139246256731 小时前
GSV5600@ACP#多接口协议转换芯片,物理 AI 便携终端的互联核心
大数据·人工智能·分布式·嵌入式硬件·spark
KaMeidebaby1 小时前
卡梅德生物技术快报 | 噬菌体展示 12 肽文库在蛋白表位定位中的应用与实验数据
大数据·人工智能·架构·spark·新浪微博
这个DBA有点耶1 小时前
国产数据库有哪些?2026年主流产品选型对比
数据库·程序人生·职场和发展·架构·程序员创富·改行学it
workbuddy小能手2 小时前
腾讯云ADP Agent Portal vs 自建智能体:架构选型对比
架构·云计算·腾讯云
就改了3 小时前
微服务异步场景链路断裂完整解决方案
微服务·云原生·架构
沪漂阿龙4 小时前
《LangChain 系列》用 LangGraph 搭建智能客服 Agent
人工智能·架构·langchain
by————组态4 小时前
Ricon组态技术架构 - 企业级Web组态解决方案
运维·服务器·前端·物联网·架构·组态·组态软件
微学AI4 小时前
递阶式智能体开发范式(HADP):从超级Agent到智能体应用的层级架构理论与工程实践
人工智能·架构·agent
老刘说AI4 小时前
类Sora模型:解锁动态视觉艺术的密码
人工智能·stable diffusion·架构·embedding
山东点狮信息科技有限公司4 小时前
点狮OA-企业级 OA 办公自动化系统架构设计与实践
spring cloud·微服务·性能优化·架构·系统架构