一、缓存概念
1. broker层面缓存
在 broker 层面里,存在一个 managed ledger 库,也就相当于 topic。也就是说每一个 topic 后边都有一个 managed ledger 进行服务存储等。
它会把 topic 里用到的所有 ledger 进行管理,并记录到元数据里。同时在消费订阅层面,也会将其订阅进度、消息签收进度等进行记录。
managed ledger cache :新写入的数据会进行缓存
2. bookkeeper层面缓存
entry 写入 journal log 时,同时也会写入到 memory table 里,这时客户端认定为写入成功。这时会提出一个 check point,当满足 checkpoint 后,会把一段时间内的 journal log 数据放置到 entry log 里。而 index DB 则主要是记录 entry 放置在 entry log 的位置信息。
二、写入时优化
1. 开启分片
2. 加大内存
producer 生产消息时,是先把消息放到队列中的,如果队列满了,消息是会被阻塞的。
3. 批量消息
开启 batched 后,调动的 broker 数量减少,调用 bookie 次数也减少了,从而可以减少客户端和服务端的cpu使用,提升消息发送和读取的吞吐量。
4. 数据压缩
5. bookie 写入优化
消息持久化配置的选项,5-3-2 模式,会比 5-5-5的模式有更高的性能
6. 优化参数参考
Broker 端
managedLedgerDefaultEnsembleSize
managedLedgerDefaultWriteQuorum
managedLedgerDefaultAckQuorum
managedLedgerNumWorkerThreads
numIOThreads
Dorg.apache.bookkeeper.conf.readsystemproperties=true -DnumIOThreads=8
Bookie 端
Journal Directories
Ledger Directories
Journal sync data
Journal group commit
Write cache
Flush interval
Add worker threads and max pending add requests
Journal pagecache flush interval
三、读取时优化
1. 加大内存
消息读取其实跟写入差不多,也有一个 queue
2. 批量读取数据
3. 多consumer
4. 优化参数参考
Bookie 端
dbStorage_rocksDB_blockCacheSize
dbStorage_readAheadCacheMaxSizeMb
dbStorage_readAheadCacheBatchSize
Read worker threads
Broker 端
Managed ledger cache
Dispatcher max read batch size
Bookkeeper sticky reads