简易版消息转发设计
业务背景
目前支付中心的支付回调消息是由支付中心发送消息给各自的业务方,而且是只发送给业务方。
但是有些其他的业务也需要收到支付回调的话,目前是需要设置不同的消费者名称去接收支付回调。但是这样会有点问题,因为其他业务可能需要同时接收多种业务的支付回调,这样的话就需要注册很多的消费者,或者说多种业务想要聚合成一种处理方式,去接收多个topic消息就不太好。
所以采用支付回调时转发的方案,发送支付回调时,如果需要转发,那么发送支付回调的同时,发送消息给转发服务,由转发服务去决定发送给谁,其他业务方也只需要配置转发规则就行。
转发设计
桥接消息
我们可以往大了想一个概念一一桥接。转发消息,其实也是桥接消息的一个子类。
配置
我们首先需要有一个配置表,配置这个桥接是属于什么类型的。
CREATE TABLE `bus_msg_bridge_config` (
`id` varchar(50) NOT NULL,
`type` varchar(20) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这张表就是桥接配置表,type字段我们约定好一个枚举
public enum BridgeMsgType implements MsgType {
/**
* 转发
*/
FORWARD("01");
}
转发topic
有了配置表之后,我们就需要针对一个配置需要转发出去的消息topic,配置和转发topic是一对多的关系。
CREATE TABLE `bus_msg_bridge_forward` (
`id` varchar(50) NOT NULL,
`config_id` varchar(50) DEFAULT NULL COMMENT '配置id',
`topic` varchar(255) DEFAULT NULL COMMENT '转发topic',
`msg_type` varchar(255) DEFAULT NULL COMMENT '消息类型',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这里的msg_type就是消息转发类型,目前支持三种全部/主/备
转发规则
CREATE TABLE `bus_msg_bridge_rule` (
`id` varchar(50) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`rule_type` varchar(255) DEFAULT NULL COMMENT '规则类型',
`fields` varchar(255) DEFAULT NULL COMMENT '字段',
`val` varchar(255) DEFAULT NULL COMMENT '值',
`display_num` int(11) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
匹配规则
我们执行转发topic的时候,需要指定一些规则,比如说如果收到的消息内容里面的字段name=测试2,如果规则设置的name=测试才进行转发,那么这条消息就会被过滤掉,不会进行转发的操作,这些就是属于匹配的概念。多个字段过滤的话就需要设置多条规则,只要有一条匹配不过就不进行转发
这里会有个规则类型的字段,它是一个枚举。
public enum RuleType {
/**
* 匹配
*/
MATCH("01");
}
因为规则可以配置多条,所以我们有一个中间表来存储转发topic和规则的映射表
CREATE TABLE `bus_msg_bridge_forward_rule` (
`id` varchar(50) NOT NULL,
`forward_id` varchar(50) DEFAULT NULL COMMENT '转发id',
`rule_id` varchar(50) DEFAULT NULL COMMENT '规则id',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
桥接配置管理
配置管理后台新增配置
点击上面的新增按钮,新增配置,这里的id要和外层传进来的id一致
新增配置
即约定好外层传进来的id,和这里的配置id一样即可。
新增topic转发
点击列表的右侧操作按钮添加topic
添加topic
注意事项:
- topic需要写全称
- 延迟只支持秒
- 校验规则多选,则需要全部通过才进行转发
查看topic
一个配置支持转发到多个topic
topic查看
这里可以看到所配置的topic信息并进行编辑
转发实战
配置转发规则
上面的表新增数据
发送转发消息
BridgeMsgDTO bridgeMsgDTO = new BridgeMsgDTO();
// 这个id就是上面转发的配置id
bridgeMsgDTO.setMsgId(notifyMessageDTO.getPcNotifyConfig().getId());
bridgeMsgDTO.setContent(message);
ProducerSendMessageFacade.sendPulsarFullMsg("cp-comm/msg-daemon/bridge-msg",JSON.toJSONString(bridgeMsgDTO));
往topic(转发的消息消费者)发消息即可。