如何为大缓存值正确准备 Apache Ignite?
How to properly prepare Apache Ignite for large cache values?
我有一个IgniteCache<String, byte[]>
这个缓存中的值可以小到几百兆字节。
根据我阅读的文档,缓存条目的值没有硬性限制。让人安心。
但是我的用例是否有任何需要担心的陷阱?
例如,我需要专门针对这种情况进行哪些配置设置?
我不建议条目大于几 MB。它可能会导致各种网络或内存问题。
如果必须,您需要尝试使用最大可能的值,然后调整设置直到您满意为止。我能想到的一件事是,将 TcpCommunicationSpi.ackSendThreshold
设置为一些较小的值,例如 4(默认值 32),以避免这些大消息排在队列中。但是可能有很多东西需要调整。
在内部,Ignite 使用字节缓冲区来序列化数据,这些缓冲区受到 Integer.MAX_VALUE
的限制,因此 2GiB 是最大缓存条目大小。
一些 Ignite API 批量处理数据,在处理大型条目时减少 batch/page 大小是个好主意:
Query.pageSize
(适用于扫描、SQL、连续查询)- 默认值为 1024
IgniteDataStreamer.perNodeBufferSize
、perThreadBufferSize
- 默认值为 512 和 4096
我有一个IgniteCache<String, byte[]>
这个缓存中的值可以小到几百兆字节。
根据我阅读的文档,缓存条目的值没有硬性限制。让人安心。
但是我的用例是否有任何需要担心的陷阱?
例如,我需要专门针对这种情况进行哪些配置设置?
我不建议条目大于几 MB。它可能会导致各种网络或内存问题。
如果必须,您需要尝试使用最大可能的值,然后调整设置直到您满意为止。我能想到的一件事是,将 TcpCommunicationSpi.ackSendThreshold
设置为一些较小的值,例如 4(默认值 32),以避免这些大消息排在队列中。但是可能有很多东西需要调整。
在内部,Ignite 使用字节缓冲区来序列化数据,这些缓冲区受到 Integer.MAX_VALUE
的限制,因此 2GiB 是最大缓存条目大小。
一些 Ignite API 批量处理数据,在处理大型条目时减少 batch/page 大小是个好主意:
Query.pageSize
(适用于扫描、SQL、连续查询)- 默认值为 1024IgniteDataStreamer.perNodeBufferSize
、perThreadBufferSize
- 默认值为 512 和 4096