前言
最开始自己公司的后台推送系统只能是用户在线时推送,推送消息也不会保存,若用户离线,那么这条推送消息就再也无法获取。更让人头疼的是:推送的内容和推送系统是耦合在一起的,这样往往在改一处代码的同时,会出现意想不到的bug。着就更加坚定了自己要把推送代码重构的决心了。下面就是自己的整个设计过程和期间遇到的问题,写出来和大家分享一下,望大家多多指教。
设计过程
最开始设计的时候是把数据的存储,修改和消息的推送放到一个类中pushmanager中,各种消息都糅合到一个message中,从后台拉取消息单独提出来pullManager,如图1:
上面的设计有如下弊端:
1、Message来表示各种类型的消息,而它又与数据库表直接关系,这样Message要把各种消息类型的不同点都包含进来,这样,添加一个消息类型,就要在数据库中添加字段来表示它与其他类型不同点。不符合开闭原则,维护性极差。
2、消息存储和推送的耦合性太强了。
针对上面问题,对其做了进一步的优化(如下图):
1、用MessageTypeBase这个抽象类来将消息的共同行为和属性抽象出来,各种不同类型的消息继承这个抽象类,然后再针对不同类型的消息添加不同的行为和属性
2、将消息存储和推送两个分开,messageManager负责消息的增删改查(拉取消息的行为也放入其中),它对外提供服务,PushManager负责消息的推送(包括单推,群推,组推)
3、MessageType中用静态常量来标识不同类型的消息对应的数字,MessagetypeContent不同消息类型对应的内容模板和标题
4、在数据库表中添加extendInfo字段(string类型),来存储不同消息的额外信息,具体的消息对其进行具体的处理(参考最后的UML图t_message表,当初自己忘记修改下图的表结构)

本文详细记录了一次后台消息推送系统的重构过程,从最初的消息存储和推送耦合,到逐步优化,实现消息类型与存储、推送的分离,降低耦合,提高维护性。文中介绍了多次设计迭代,包括消息类型的抽象、数据库结构的调整以及推送环境参数的处理,最终形成了一个较为完善的后台消息推送框架。

3645

被折叠的 条评论
为什么被折叠?



