@@ -46,7 +46,7 @@ func NewTopic(topicName string, nsqd *NSQD, deleteCallback func(*Topic)) *Topic
4646 t := & Topic {
4747 name : topicName ,
4848 channelMap : make (map [string ]* Channel ),
49- memoryMsgChan : nil ,
49+ memoryMsgChan : make ( chan * Message , nsqd . getOpts (). MemQueueSize ) ,
5050 startChan : make (chan int , 1 ),
5151 exitChan : make (chan int ),
5252 channelUpdateChan : make (chan int ),
@@ -56,10 +56,6 @@ func NewTopic(topicName string, nsqd *NSQD, deleteCallback func(*Topic)) *Topic
5656 deleteCallback : deleteCallback ,
5757 idFactory : NewGUIDFactory (nsqd .getOpts ().ID ),
5858 }
59- // create mem-queue only if size > 0 (do not use unbuffered chan)
60- if nsqd .getOpts ().MemQueueSize > 0 {
61- t .memoryMsgChan = make (chan * Message , nsqd .getOpts ().MemQueueSize )
62- }
6359 if strings .HasSuffix (topicName , "#ephemeral" ) {
6460 t .ephemeral = true
6561 t .backend = newDummyBackendQueue ()
@@ -222,18 +218,25 @@ func (t *Topic) PutMessages(msgs []*Message) error {
222218}
223219
224220func (t * Topic ) put (m * Message ) error {
225- select {
226- case t .memoryMsgChan <- m :
227- default :
228- err := writeMessageToBackend (m , t .backend )
229- t .nsqd .SetHealth (err )
230- if err != nil {
231- t .nsqd .logf (LOG_ERROR ,
232- "TOPIC(%s) ERROR: failed to write message to backend - %s" ,
233- t .name , err )
234- return err
221+ // If mem-queue-size == 0, avoid memory chan, for more consistent ordering,
222+ // but try to use memory chan for deferred messages (they lose deferred timer
223+ // in backend queue) or if topic is ephemeral (there is no backend queue).
224+ if cap (t .memoryMsgChan ) > 0 || t .ephemeral || m .deferred != 0 {
225+ select {
226+ case t .memoryMsgChan <- m :
227+ return nil
228+ default :
229+ break // write to backend
235230 }
236231 }
232+ err := writeMessageToBackend (m , t .backend )
233+ t .nsqd .SetHealth (err )
234+ if err != nil {
235+ t .nsqd .logf (LOG_ERROR ,
236+ "TOPIC(%s) ERROR: failed to write message to backend - %s" ,
237+ t .name , err )
238+ return err
239+ }
237240 return nil
238241}
239242
0 commit comments