一个API规则所有产品数据
这个案例研究是一个帖子写的大卫•曼、软件开发人员和项目经理Liip。希望你的公司出现在Symfony官方博客吗?ob娱乐下载发送一个建议和案例研究到fabien.potencier@sensiolabs.com
Liip走近了米格罗在瑞士,最大的零售公司。他们面临的挑战是,他们在几个大型企业产品数据管理系统和数据库,不适合实时访问。
米格罗有各种网站和移动应用程序,该应用程序都需要查询数据。Liip建立M-API, Symfony收集来自ob娱乐下载不同系统的数据的应用程序,清洗起来Elasticsearch和索引。这个索引可以查询实时通过REST API方便JSON和XML输出。M-API处理每天几百万的请求,即使在交通高峰。
图片:构建的API文档欧宝官网下载appNelmioApiDocBundle和swagger.js
API架构
这个架构是冗余和极其可伸缩,从而使它可以简单地添加更多的服务器,在必要时。
Elasticsearch很大的文件和包含很多嵌套数据。我们决定反规范化所有产品相关数据到每个产品的记录,使查找更快。当产品信息的任何部分发生变化时,我们重建和索引的信息产品。API提供查询参数来控制客户所期望的细节的数量。
Symfob娱乐下载ony应用程序是建立在数据域模型类。索引时,模型从外部系统和填充数据序列化为Elasticsearch。查询,模型从Elasticsearch反应恢复,然后请求中重新序列化格式和要求的细节。我们使用JMS序列化器因为它可以groupfields控制的详细级别,甚至让我们支持多个版本的API相同的数据源。
当然,有一些开销unserialize Elasticsearch数据和re-serializing它,但我们所获得的灵活性,这是值得的。提高响应时间,我们运行HipHopVM,备用PHP实现通过Facebook Symfony的API服务。ob娱乐下载清漆配置去HHVM默认情况下,回落到正常php-fpm + Nginx堆栈如果HHVM实例失败。我们测试PHP 5.5和HHVM吗显示我们巨大的性能提升和更好的可伸缩性。标准PHP 7表明它改进,HHVM可能不再是必要的。
在M-API面前,我们运行清漆服务器缓存的结果。我们使用FOSHttpCacheBundle管理缓存头和失效缓存数据。
一个单独的API
M-API是一个单独的Symfony应用程序并没ob娱乐下载有提供任何类型的HTML渲染。只有关心收集数据,正常化和索引,通过REST API和交付信息。这允许多渠道策略。
系统建立在M-API包括产品目录网站,一个移动应用程序,客户社区平台和各种其下对具体产品的营销网站。欧宝体育平台怎么样这些网站可以独立开发,可能比PHP和其他技术。产品目录是一个Symfony应用程序,手机应用程序是一个本机Iob娱乐下载OS和Android应用程序,和许多营销网站完成了基于Java的CMS木兰。
图片:产品信息的网站是一个简单的Symfonob娱乐下载y应用程序没有本地数据库,读取所有数据API。
由于M-API,这样web应用程序现在可以专注于他们的用例和发现数据方便而不必重新实现进口他们需要从各种来源的数据。这可以节省时间和精力,同时提高数据质量的改进可以集中以来M-API系统。
数据收集是相当复杂的。M-API收集核心产品的数据中心产品目录系统,从定价系统。它准备图像通过CDN网络访问。它增加了特定的元数据(如化学警告危险的产品或相关产品基于数据仓库的分析。它关系到库存系统提供可用性信息和商店定位器。但它也考虑流行信息从客户的反馈和谷歌分析。
开发过程
与客户一起,Liip选择敏捷过程。最小可行产品只是提供产品在JSON和XML格式的数据。几个月后,有足够的功能实现,M-API上线。在过去的18个月里,我们不断添加新数据源和额外的API端点,释放出两周的sprint。
索引结构
在索引,我们反规范化的数据查询尽可能快。例如,整个面包屑的产品类别是存储在产品完整的信息只有一个Elasticsearch请求。为此,我们需要大量的数据索引。让这个可行,我们缓慢复制所有数据查询本地系统(到一个MySQL数据库在我们的例子中,但它本质上是一个序列化的响应数据缓存。
我们可以使用任何持久性存储系统)从MySQL数据库和索引。索引的过程也为加速缓存中介数据复述。这些优化允许我们进一步分割过程分为数据采集,然后索引。Elasticsearch作为集群运行与几个节点,主要是因为高负载的索引数据。
主数据导入一系列运行Symfony命令更新本地MySQL数据库的最新信息。ob娱乐下载这是通过工人并行通信RabbitMQ。一旦数据收集的消息队列是空的,第二部分的索引Elasticsearch开始,再次使用工人并行的任务。
挑战之一是改变Elasticsearch指数的结构,你需要重建。几个数据成千上万的文件,所以索引过程需要相当长的一段时间。模式的变化发生时,我们首先将代码部署到服务器没有把它在线,构建一个新的索引,一旦准备好了新的索引,开关新部署的web请求。新指数是由复制文件从旧的指数,这是一个更快,把系统上的应变小于重新从MySQL。
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
Loïc Vernet is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now