mailq 邮件队列
基于NSQ.
有两个基本概念:
- topic
- channel
消息发送给topic,会分别拷贝分发给不同的channel。
nsqd
队列的服务端,可横向扩展开启多个
nsqlookupd
服务发现服务端,各个nsqd连接到它,通过它进行统一的管理。这个是可选的,一般开启一到两个。目前只开启一个。
nsqadmin
网页界面监控各个nsqd的状态。如果要使用,则必须配置nsqlookupd。
生产者客户端编写
可用官方的库,或者使用nsqd的http接口
消费者的编写
和生产者只需要指明topic不同,消费者还需要指明channel
r-pac邮件队列消息体格式
采用bson格式编码,实际发送消息体为人类不可读的二进制数据。
type Attachment struct {
// 附件名称
Name string `bson:"name"`
// 附件二进制数据
Data []byte `bson:"data"`
}
type MailMessage struct {
// 邮件项目来源;必填
Source string `bson:"source"`
// 邮件类型,自定义;必填
Type string `bson:"type"`
// 邮件发件人的名称;可选
FromName string `bson:"fromName"`
// 邮件标题;必填
Title string `bson:"title"`
// 邮件类容;MIME 类型为 text/html;必填
Body string `bson:"body"`
// 是否有附件;如果有,则必填
File bool `bson:"file"`
// 附件列表
Attachments []Attachment `bson:"attachments"`
// 收件人,查询数据库来获取
ToAddress []string
CcAddress []string
// 附件保存的本地路径列表
AttachSaved []string
}
r-pac消费者进程处理逻辑
监听的topic为email, channel为smtp。
收到消息后,用bson进行解码。
收件人和cc的地址由redis独立存储和动态配置,可通过网页界面进行添加、修改、删除。
redis存储的key格式为<source>:<type>:[from|to]
:
<>
表示来自消息体,即由生产者决定[]
表示多个选择一个
每条消息处理结果都添加日志到日志文件末尾,一行一条记录。每条记录采用json格式序列化。