最近在整理代码,看到不少在设计、实现上有意思的模块,这里总结记录下,将别人的东西消化成自己的,或许以后用得着呢。
这里介绍下一个简单的消息路由器,第一版很简单,主要特征如下:
- 每个消息在生成时指定消息类型
- 不同类型的消息分发到不同的消息队列
- 不同类型的消息由不同的消息处理器消费
- 消息消费完成后可以执行回调逻辑
使用说明
初始化流程:
qs := NewQueueSwitch()
生成消息路由器实例- 调用
qs.SetRoute
和qs.SetHandle
对不同类型的消息设置消息路由和消息处理器
消息发送流程:
- 构造消息:
1 | ch := make(chan interface{}, 1) // 消息处理结果会写入该管道 |
- 发送消息到路由器:
1 | qw.Send(msg) |
- 等待消息处理完成:
1 | result := <-ch |
下面我们来看一下该消息模型的测试示例:
测试
1 | package queue |
测试结果:
1 | hxzdeMac-mini:~/workspace/golang/src/github.com/hxzqlh/queue (master) $ go test |
具体细节可参考源码 github.com/hxzqlh/queue
总结
从代码可以看出,消息路由器主动硬编码它所支持的消息类型和消息处理器,并将消息路由到不同队列,这种模式:
优点:
- 消息分发、处理的逻辑清晰明朗
缺点:
- 消息发送者必须知晓消息路由器支持的消息类型,否则无法构造消息,增加了消息发送者的负担。