前言:
此时姐妹们对“apache可以用作缓存服务”可能比较重视,朋友们都想要分析一些“apache可以用作缓存服务”的相关资讯。那么小编也在网络上汇集了一些对于“apache可以用作缓存服务””的相关资讯,希望咱们能喜欢,大家一起来学习一下吧!在过去的几年中,在一个句子中听到"分布式"和"数据存储"这两个词会立即使我想到一个单词" Redis"。 现在,这还不完全是我的无知。 快速浏览一下会提醒您,Redis在键值存储的排名中仍然排名第一,在所有数据库引擎中排名第八。 然而,随着谚语的流逝,有多种方法可以给猫皮剥皮。 而且其中某些方法显然比其他方法更平等。 看一下Apache Ignite。
Apache ignite是一个内存中的计算平台,具有持久性,强一致性和高可用性,并具有强大的SQL,键值和处理API。 在这里可以找到Ignite和Redis的全面比较。 与基于快照的Redis持久性模型相比,它对本地持久性的可选支持相当先进。 Ignite支持ACID保证交易的能力也非常出色。 但是,与ANSI-99兼容,水平可扩展且具有容错功能的SQL引擎给我留下了最深刻的印象,该引擎使您可以与Ignite交互,就像使用JDBC,ODBC驱动程序或本机SQL API的常规SQL数据库一样。
Apache Ignite支持多种技术堆栈,包括Java,.Net,C ++,Python,JavaScript和PHP。 在本文中,我将使用Spring Boot和Java中的示例。 在单个Spring API的上下文中有几种使用Ignite的方法。 通过配置SpringCacheManager可以将其设置为简单的API级别的缓存,这里探讨这种方法。 Ignite也可以用作服务的主要持久数据存储,此处探讨了这种方法。 本文的目的是研究一种有趣的方式来使用Ignite的功能来形成一个微服务间,事务性的内存数据存储。 为简单起见,我在这里探索的示例是两个基于Spring Boot的REST API。
菜单API是参考数据存储,它是所有菜单相关数据的真实来源。 它在mySql数据库中存储和管理与物料,价格和库存盘点相关的信息。 此处的要求是使数据与Order API同步,该API实际验证,接受和计算所有订单的总数。 Order API具有自己的mySql数据库,用于存储订单详细信息。 在此设计中,由菜单API mySql DB管理和存储的项目也存储在与Order API共享的Ignite缓存中。
由于这些商品已分配给订单,因此订单API将减少这些商品的可用库存数量。 需要注意的是,传入的订单没有商品的ID,因此Order API需要按名称查询缓存以找到匹配的商品。 两种API都可以选择以典型的云托管负载平衡方式运行多个实例。
选择该方案是为了显示有关点火缓存使用情况的几种不同方案/模式。
缓存配置
如果没有Ignite缓存配置,则没有什么要注意的,这是" Item"对象的缓存,原子性模式为" Transactional"。 这表明我们需要完整的ACID保证。 主索引是一个长值,在这种情况下,它是商品ID。
缓存中使用的" Item"实体也有一些特殊之处。 正如注释所建议的那样,它被设计为存储在名为" items"的数据库表中(这实际上是由菜单API来完成的),其某些字段用@QuerySqlField进行了注释。 此批注是特殊的Ignite批注,它使这些字段对Ignite SQL查询可见。 其中一些注释的@QuerySqlField(index = true)表示这些字段在ignite缓存中建立了索引。 我使用了Lombok注释来尽可能地删除样板代码。 缓存配置和Item类都位于单独的库中,这两个API都使用该库。
缓存使用模式
第一种用法是Item对象的基于事务的缓存插入,由Menu API执行。
只要配置了TRANSACTIONAL原子性模式,Ignite就支持事务的OPTIMISTIC和PESSIMISTIC并发模式。 并发模式确定何时应获取入门级交易锁:在数据访问时或在准备阶段。 锁定可防止同时访问对象。 可以在Ignite文档中找到有关TransactionConcurrency和TransactionIsolation的更多信息。 这里的重点是Ignite为用户提供了事务的并发和隔离级别的灵活性,可以将其配置为匹配特定用例的性能和行为要求。
除此之外,Ignite还提供了在同一缓存上执行SQL查询的功能,如下面的代码所示。
此代码演示了Order API如何查询商品缓存以查找与订单中指定的商品名称相匹配的正确商品。 请注意,可以检索带@QuerySqlField注释的字段,并且名称字段(在缓存中为索引)用于WHERE子句。 由于这是只读操作,因此此处不使用任何事务。 但是对于更新查询,您可以选择使用事务。
另一种情况是通过事务更新缓存中元素的属性。 在这种情况下,Order API在一次交易中更新订单中每个项目的可用库存数量。 如果任何单个操作失败,则放弃交易。
结论
Ignite与Java和spring很好地集成在一起,并且在工作上花费了最少的精力。 在此处提到的示例中,Ignite以嵌入式模式运行,这意味着没有单独的点火集群。 实际上,点火节点与启动它的spring API在同一JVM上运行。 这消除了使用点火缓存的任何网络开销。 Ignite也可以作为单独的独立集群运行。 您可以选择将ATOMIC用作CacheAtomicityMode而不是TRANSACTIONAL,这不能提供强大的一致性,但是由于不必锁定数据,因此通常具有更好的性能,并且这完全取决于您的使用情况。 本文绝不是Apache Ignite的全面介绍,因为它具有其他一些功能,例如位于同一地点的处理和分布式机器学习加速,它只是研究一种潜在的使用场景。
代码
菜单API:
订单API:https://github.com/Dishan006/ignite_order_api.git
通用库:
(本文翻译自Dishan Metihakwala的文章《Apache Ignite as an Inter-Microservice Transactional In-Memory Data store》,参考:)