在Channel结构体中用到了两种优先级队列pqueue.PriorityQueue和inFlightPqueue。
deferredMessages map[MessageID]*pqueue.Item
deferredPQ pqueue.PriorityQueue
deferredMutex sync.Mutex
inFlightMessages map[MessageID]*Message
inFlightPQ inFlightPqueue
inFlightMutex sync.Mutex其中deferredMessages和inFlightMessages 使用map储存了MessageID和Message的对应关系,用于根据MessageID获取对应的Message。而deferredPQ和inFlightPQ是两种优先级队列。deferredPQ队列中储存了延时消息和消息投递失败需要等待指定时间后重新投递的消息,inFlightPQ队列中储存了正在投递但还没确认投递成功的消息。
一、PriorityQueue优先级队列
源码位置在 nsq/internal/pqueue/pqueue.go文件中
PriorityQueue实现了Golang源码包heap中的接口,是最小堆。在了解PriorityQueue之前需要先对堆的概念有了解,可以参考:
https://blog.csdn.net/skh2015java/article/details/83183681
PriorityQueue队列中储存的是Item指针,Item结构体及字段说明如下:
版权声明:本文为simanstar原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。