NSQ消息队列实践

已发布 2017-08-04 09:22:29

mailq 邮件队列

基于NSQ.

有两个基本概念:

  1. topic
  2. 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]:

  1. <>表示来自消息体,即由生产者决定
  2. []表示多个选择一个

每条消息处理结果都添加日志到日志文件末尾,一行一条记录。每条记录采用json格式序列化。

comments powered by Disqus