上下文:
在 RocketMQ 中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储
单元都是定长,访问其中的存储单元使用 Offset 来访问,offset 为 java long 类型,64 位;
解释如下:
Integer.MAX_VALUE = 2147483647 10位
Long.MAX_VALUE=9223372036854775807 19位
假设消息队列生产qps到达 Integer.MAX_VALUE,那么100年数据量是多少呢?
粗略计算: Integer.MAX_VALUE * 36500*86400 = ?
10 + 5 + 5 - 1 = 19位 很接近 Long.MAX_VALUE了 (第一个10 是Integer.MAX_VALUE位数,第二个 5 表示 36500 位数,第三个5 表示 86400 减去 1 )
实际值:
Integer.MAX_VALUE * 36500*86400 = 6772304429179200000 < Long.MAX_VALUE
所以如果系统qps达到了Integer.MAX_VALUE,offset100年也是够用的,但是什么系统能达到qps = Integer.MAX_VALUE ?暂时还为止! 所以使用rmq队列长度理论上100年完全站得住脚的。
可以认为 Message Queue 是一个长度无限的数组,offset 就是下标。