ヤフー株2023101日本线路ヤフー株式会社になりました。线路ヤフー株式会社の新しいブログはこちらです。线路ヤフー 技术博客

テクノロジー

Apache Ignite的“最近购买”

阿帕奇点燃導入の体験レポート

Roman Shtykh(Apache Ignite委员会数据和科学解决方案小组)@拉什蒂克

Toru Yabuki(购物服务集团、商业公司)

雅虎!ショッピングは、ユーザが買い物を楽しむために様々なサービスを提供する日本最大級のE类コマースプラットフォームです。本稿では、阿帕奇点燃を用いて、階層を持つカテゴリーなどで絞り込みながらたった今売れた商品を取得できるサービスを刷新した事例を紹介します。スケールアウトする阿帕奇点燃を採用することで既存の关系型数据库管理系统での性能上の制約を解消し、同時にシステムをシンプルにできました。

雅虎!日本是日本最大的电子商务平台之一,我们不断努力改善用户的购物体验,试图了解他们的需求和行为,并应用这些知识提供更好的购物体验。我们为此提供了大量服务和API,随着对它们的请求数量不断增长(由于新服务的发布,或来自众多微服务的调用增加),我们必须能够相应地进行扩展,并保证亚秒级的数据访问。

对每秒处理数万个请求并在不久的将来增长的需求很高的服务之一是“最近的购买”查询服务以获取此类购买的最新信息n个指定深度中特定类别的项目。最初,数据存储在RDBMS中,达到了5亿多条记录,旧的数据库基础设施无法处理越来越多的请求,并阻止了其他用户采用服务。现在是更新数据库以满足用户更高需求的时候了。




图1。传统系统的高级架构。

在选择解决方案时,我们需要考虑以下几点:

  • 所依赖的服务memcached(内存缓存)为了提高API响应速度,但存在运营成本问题,我们希望降低成本,但获得相同/相似的服务响应能力;
  • 根据不断增加的查询数量进行扩展;
  • 能够在数据大小增长时进行扩展。查询“最近购买”API的更多服务可能会增加对新功能的需求,这反过来很可能会导致我们存储更多数据;


出典:ヤフーショッピングの買い物マップ」

图2。服务使用示例。按“杂货店”类别绘制日本各地最近销售的产品地图。

为了寻找这样的解决方案,我们进行了POC和多次测试阿帕奇点燃(以下简称点燃)--“一个以内存为中心的分布式数据库、缓存和处理平台”[1],以其集群弹性和SQL支持而闻名。这个数据库平台完全满足了要求,而且我们以前在Ignite[2,3]方面有一些工作经验,这对快速在生产中推出解决方案有很大帮助。
在Ignite中,我们删除了memcached,它起到了一个后备缓存的作用,结果有些过时,如果我们以快速的方式使条目无效,而不提及操作成本,它将进一步削弱优势。与此同时,我们并没有失去服务的响应能力,甚至在这方面取得了一些进展。

系统架构非常简单。我们有通过卡夫卡经纪人进行的购买活动,这些活动在经历转换后注入Ignite集群。最近购买的商品按类别和多种条件进行搜索,因此需要SQL查询的灵活性。Apache Ignite提供了ANSI-99 SQL支持[4],支持所有DML命令,并提供了与分布式系统相关的DDL命令子集。可以使用本地库的SQL API查询数据,但我们选择使用瘦客户机,因为它们不需要标准的拓扑连接,因此更容易通过容器服务处理。随着Apache Ignite 2.7的发布,可以使用Python、Node.js、PHP和C++瘦客户机[5],将遗留代码切换到查询Ignite相对容易。作为Node.js客户端的早期采用者,我们甚至成功地使用了它并帮助解决了问题[6]。




图3。使用Apache Ignite的高级体系结构。

不要仅仅因为数据在内存中,就指望SQL查询会很快。当涉及到查询时,map-reduce是通过集群完成的,数据必须正确索引和组织(特别是在需要关联的情况下)。我们使用查询提示对查询进行了优化,根据结果数据集的不同,有些查询最适合处理特定的二级索引,但有些查询更适合处理其他组索引或仅扫描内存中的记录。必须注意不要将过多的数据卸载到堆中,否则会显著降低处理速度。因此,所有查询的堆使用率都很低,CPU和I/O消耗也很低。

从操作角度来看,我们发现Ignite

  • 非常容易扩展
  • 拥有一组丰富的API,可用于构建监控工具
  • 具有多个连接器,便于数据注入[7]

    但是
  • SQL查询指标尚不成熟,但正在逐步改进
  • 与其他主要数据库系统(如Cassandra或MySQL)相比,不支持滚动升级,未来我们需要进行蓝绿部署。

总的来说,我们对Apache Ignite有很好的经验,除了使用其SQL功能外,还计划考虑将其用于分布式计算密集型任务。

工具书类

[1] 什么是点燃?https://apacheignite.readme.io/docs网站
[2] 阿帕奇点燃とのインメモリーコンピューティングhttps://ameblo.jp/principia-ca/entry-12124166753.html
[3] 阿帕奇点燃を分散キャッシュに利用したシステム負荷軽減https://developers.cyberagent.co.jp/blog/archives/1799/
[4] SQL一致性https://apacheignite-sql.readme.io/docs/sql一致性
[5] 瘦客户端功能https://cwiki.apache.org/confluence/display/IGNITE/Thin+客户端+功能
[6] Node.js大型有效载荷问题https://issues.apache.org/jira/browse/IGNITE-9382
[7] 流媒体集成https://apacheignite mix.readme.io/docs/geting started#部分-流式集成

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました

このページの先頭へ