给消息加 priority 就能让重要的先被处理吗?为什么有时高优先级的消息还是排在后面?开 255 档优先级要付出多少代价?quorum 队列呢?这篇在 RabbitMQ 4.3.6 上逐项验证。
发送顺序: a(p1) b(p5) c(p10) d(p3) e(p0) f(无) g(p7) h(p5) 取出顺序: ['c(p10)', 'g(p7)', 'b(p5)', 'h(p5)', 'd(p3)', 'a(p1)', 'e(p0)', 'f(pNone)'] 同一优先级内保持先进先出(b 在 h 前);没有优先级的消息按 0 算,在 p0 的 e 之后(它们同级、先进先出)
队列声明时带 x-max-priority,消息带 priority 属性。取出时按优先级降序,同级先进先出,没写优先级的按 0 算。
max-priority=5,发 a(p5) b(p200) c(p6) d(p1):取出 ['a', 'b', 'c', 'd'](a、b、c 都按 5 算,先进先出) 普通队列发 a(p1) b(p9) c(p5):取出 ['a', 'b', 'c'](优先级被忽略)
消息优先级超过上限的按上限算;没声明 x-max-priority 的队列完全不看优先级。
prefetch=20,先发 60 条低优先级(p1)再发 1 条 HIGH(p10);HIGH 是第 21 个被处理的(共 61 条) prefetch=1:HIGH 是第 2 个被处理的(共 61 条)
优先级只能重排还在队列里的消息。已经预取给消费者的消息不会被后来的高优先级消息超过,所以要让优先级有意义,消费者的 prefetch 要小。
x-max-priority=不设 : 发布 20000 条 510 ms,basic_get 取完 1570 ms x-max-priority=10 : 发布 20000 条 517 ms,basic_get 取完 1724 ms x-max-priority=255 : 发布 20000 条 1218 ms,basic_get 取完 6108 ms
优先级档数越多,取出越慢:取 20000 条,255 档的耗时是不设优先级时的 3.9 倍,10 档的开销只有一成左右。
空队列内存(字节): 不设: 14008, max-priority=10: 56840, max-priority=255: 1152088
空队列的内存:不设 14 KB、10 档 57 KB、255 档 1.1 MB,每多一档就多一份内部结构。
quorum + x-max-priority=5 → ChannelClosedByBroker: (406, "PRECONDITION_FAILED - invalid arg 'x-max-priority' for queue … of queue type rabbit_quorum_queue") 依次发优先级 [1, 9, 3, 5, 2, 10, 0, 7, 4, 6, 8, 12, 200, 5, 5] quorum 队列取出(序号:优先级): ['12:200', '11:12', '5:10', '1:9', '10:8', '7:7', '9:6', '3:5', '13:5', '14:5', '8:4', '2:3', '4:2', '0:1', '6:0'] 优先级从大到小排好,同级(三个 5)保持先进先出(序号 3、13、14);200 没有被截成 255 以内的某个值(quorum 没有 x-max-priority 这个上限)
声明 quorum 队列时不能带 x-max-priority(406),但消息上的 priority 照样被排序,实测是完整的降序、同级先进先出。(这与我印象中“quorum 只有高低两档”的说法不同,以 4.3.6 实测为准。)