RocketMQ与SpringBoot整合进行生产级二次封装( 二 )

  • 选哪种? 个人而言:业务系统复杂的优先选择第二种 ,简单业务的选择第一种(尽量采用封装,后续维护方便) 。对于一个复杂的系统,本身业务级的代码就已经很多了,结果还要每个人处理全部一样的东西,消费者越多代码冗余越多 。如果一个系统只是为了使用MQ来进行业务分离,消费者也不多,那么可以选择最快的方式,但是最终会选择第二种,如果业务随着时间增长越复杂,越晚改成第二种花费的代价越大! 第一种就好比此时我们要直接操作内存,原生操作就好比C++或C,可以直接操作内存,但是同时用完后还要自己写各种异常处理和释放内存;代码封装就好比JAVA,我们只需要告诉Java我们要使用内存,然后用完就不用管
  • 企业中,业务功能产出是一级优先级,在此之上才能有更高级的东西 。技术服务于业务,而不是业务服务于技术!比如现在30个人的系统,我们要使用缓存加速访问,那么我们是选择 内部缓存(直接用集合或者map存起来)还是用redis? 内部缓存和Redis能不能达到目的?能 哪个更方便更快?内部缓存!内部对象就很快实现 如果业务发展迟早会转为Redis这种专业的缓存中间件,就好比业务发展前第一种,业务发展后选择第二种,但是对于大部分业务系统来说功能增加是很快的,特别是产品同事上一分钟提需求下一分钟就要上线这种(开个玩笑~),所以我们在引用一个技术需不需要进行二次封装时需要技术负责人对业务增长有一个预判 。建议是都进行封装一下
  • 1.2 封装的抽离点
    1. 对于二次封装,其中最主要的就是找出该框架在日常使用中所出现的大部分涉及到的操作,然后找出变化操作和不变化操作
    2. RocketMQ日常使用主要场景为例: 发送消息阶段:准备需要发送的消息、发送消息、记录原始消息日志、发送失败处理、可靠性处理 消费消息阶段:记录接收消息日志、业务处理、业务日志记录、异常处理、异常重试、异常通知、死信处理
    3. 提取变化点和不变化点(可以抽取为公共处理的场景) 发送消息阶段: 变化点:准备需要发送的消息 不变化点:发送消息、记录原始消息日志、发送失败处理、可靠性处理 消费消息阶段 变化点:业务处理、业务日志记录 不变化点:记录接收消息日志、异常处理、异常重试、异常通知、死信处理
    4. 从上可以看到,对于RocketMQ的使用,大部分场景都是可以抽离成一个公共的方法处理,只有业务级的需要自己处理,所以如果我们把不变化场景抽取后,每个同事只需要写自己业务相关部分即可
    5. 抽取后的复杂度:对于新加一个消费者,只需要处理业务相关三个场景(准备需要发送的消息、业务处理、业务日志记录),剩下的九个场景,只需要封装一次就可以 。需要现在就几十个消费者,可以想想一些减少了多少代码冗余
    1.3 设计模式的应用
    1. 要封装出一个好的抽象层,【设计模式】建议好好体会和学习一下
    2. 设计模式对于用不到的人来说比较虚幻,对于用的到的人来说,这个真牛X
    二、二次封装核心要点2.1 二次封装核心点2.1.1 封装主要讨论点
    1. 对于RocketMQ或者说对于整个MQ体系来说(不管是RabbitMQ、RocketMQ、Kafka)等封装的核心主要有两个:发送消息、消费消息者两个场景
    2. 对于RocketMQ我们主要讨论三个地方:RocketMQTemplate封装、RocketMQListener封装和广播消息的封装
    3. 广播消息是分布式系统中同时让所有节点都干一件事情的一个好的方式,如果用不到忽略广播消息即可
    2.1.2 发送/消费的几种消息实体
    1. RocketMQ发送消息对于不同的使用来说,大部分选择下面的几种发送消息类型 A、发送Json对象,比如Fastjson的JSONObject B、直接发送转Json后的String对象 C、根据业务封装对应实体类 D、直接使用原生MessageExt接收
    2. 怎么选择?怎么选择才是最优? 上面哪一种都可以达到目的,如果要统一封装就必须要有一个标准 怎么选择只需要回答这个问题:在不看消息发送者的情况下,消费者怎么知道发送者发送的消息含义? 比如现在有一个订单消息,如果我们不看消息发送者,怎么知道发送者给消费者发送哪些字段 A、B、D可以吗?一定不可以!JSON对象和String对象,如果我们不看消息发送者不可能知道到底发送了啥,这点我相信没有可以讨论的地方,因为类型决定了这个操作不可能 C可以吗?可以!此时不需要看消息发送者,只需要看消费者的实体类点进去,有哪些业务字段一清二楚 可能有杠要抬了,有看实体类的功夫,我看消息发送者都看完了 灵魂拷问1:如果消息发送者和消费者不在一个系统怎么看?邪魅一笑,不同业务线可能没代码权限吧?分布式系统完全独立可能吧? 灵魂拷问2:如果现在需要一个功能,如果某些必须要的字段消息发送者如果没有给的话需要校验,普通String和JSONObject怎么实现?换成实体类呢?


      推荐阅读