如何在ApacheIgnite缓存上持续更新有序数据

如何在ApacheIgnite缓存上持续更新有序数据,ignite,Ignite,用例 这是我们正在研究的拓扑 服务器-1-->marketData缓存,保存不同的股价信息 客户端-1-->在缓存上推送数据 客户端-2-->连续查询,按键监听marketData cache上的更新 我希望数据遵循接收和推送到队列中的顺序。原因是客户端2不应该获取旧数据。例如,工具的最后价格数据从100移动到101,然后移动到102。客户机-2应该按照相同的顺序进行,而不是按照100到102然后是101的顺序进行。 因此,对于缓存中的密钥,我希望消息按顺序推送 将数据推送到缓存上的方法: pu

用例

这是我们正在研究的拓扑

服务器-1-->marketData缓存,保存不同的股价信息

客户端-1-->在缓存上推送数据

客户端-2-->连续查询,按键监听marketData cache上的更新

我希望数据遵循接收和推送到队列中的顺序。原因是客户端2不应该获取旧数据。例如,工具的最后价格数据从100移动到101,然后移动到102。客户机-2应该按照相同的顺序进行,而不是按照100到102然后是101的顺序进行。 因此,对于缓存中的密钥,我希望消息按顺序推送

将数据推送到缓存上的方法:

  • put
    似乎是最安全的方式,但看起来缓存更新缓慢且完全,然后线程移动到下一条语句。这可能不适合每秒推送20000次更新

  • putAsync
    似乎是个好方法,我的理解是它使用剥离池将数据推送到缓存上。由于剥离池最多使用8个核,因此速度应该更快。但是,由于多个线程正在并行处理,因此它是否在数据被推入时确认了数据顺序

  • DataStreamer
    似乎是最好的方法,因为它也并行处理事情,但问题还是在于将数据放入缓存的顺序。API文档还提到,数据的排序不保证。

  • 有人能澄清一下吗?我找不到对这些方法有更深刻理解的文件。
    以上哪种方式是推动市场数据等数据不断更新的最佳方式?

    这取决于您的数据结构。我假设关键是符号(或符号和地点),特别是时间不是一个因素

    你的三个选择实际上是两个。前两者实际上是相同的。唯一的区别是它是等待确认还是返回未来。方案二可能会稍微占用更多的资源,但不会更快

    条带化线程池的思想是使用相同的线程更新相同的密钥,因此只要每个节点有一个队列,就应该保持顺序。您可以通过将
    perNodeParallelOperations()
    设置为1来实现这一点


    您可能还想尝试条带化线程池的大小。

    谢谢Stephens。。是的,钥匙就是符号。我希望您在这里提到的perNodeParallelOperations是针对IgniteDataStreamer的。如果将其设置为1,将不会影响并行处理不同密钥的更新,或者是基于每个密钥?我们希望至少有8个(内核数)密钥正在并行更新。我还使用allowOverwrite to true每次都用最新的值更新值。是的——我应该更清楚——这是IgniteDataStreamer的一个参数。维护顺序的开销将对吞吐量产生一些影响,但不同条带化线程上的密钥仍应并行更新。请确认putAsync是否也使用条带化池?我找不到相关的确认文件,如果您有,请共享链接。@StephenDarlington在本例中为perNodeParallelOperations()到1。数据延迟的程度handeled@Trans几乎所有读/写操作都使用条带化池。这可能应该记录在某个地方,但我不确定在哪里。