用于电子商务的PHP库:与ATOL和Payture一起使用,解析GS1代码和其他任务

嗨,我叫Pavel Savelyev,我是Lamoda业务流程自动化部门的负责人。 我们处理非常不同的任务,并尝试为每个任务选择最方便的工具。 因此,我们使用不同的语言-在我们的系统中,您可以找到Java,Go和用于Android的Kotlin。 同时,开发工作的重要部分是用PHP进行的;上面编写了超过十二种服务,这些服务不仅可以自动执行订单,而且可以自动化广泛的交付网络,三个国家的呼叫中心和我们自己的照相馆的运作流程,并以表格形式提供所有这些服务为我们的B2B合作伙伴提供服务。 这些服务由我们部门的5个开发团队支持和开发。

图片

随着服务本身及其周围基础结构的发展,在这些系统中更经常出现类似的任务,例如登录到通用的CLS(集中式日志记录系统),测试文件存储,为Prometheus收集度量标准等。 我们尝试标准化解决此类问题的方法,并将通用组件用于不同的系统。

当其中一个团队面临着可能对所有人通用的新服务/工具的改编或集成时,我们便开始在这个团队中开发库。 然后准备完成的组件以备将来使用,并在公共领域进行布局。

因此,我们定期进行这样的流程,因此我们制定了一条指南,使我们能够最轻松地进行此操作-我将尝试在下一次会议中对此进行报告。

我们有超过二十个PHP库在GitHub上公开可用。 而且我们计划进一步传播。 怎么了 好吧,我们投入了大量资源,并且(我想相信)做得很好。 而且,我们狡猾地希望其他开发人员能够使用我们的库,帮助他们完成和进一步开发,而不是花时间从头开始编写其类似物。 在本文中,我想简要地讨论七个旨在解决电子商务任务中的常见任务的库-如果它们对您有用,我将感到非常高兴,并且我将很高兴共同开发它们:)

1.在线财务:ATOL Online的客户


与其他俄罗斯公司一样,我们也必须完全遵守FZ-54的要求,其中之一就是在线财务。 始终在lamoda.ru上预付的所有订单均会被结算:它们生成在线支票,发送给客户。 我们的会计服务通过API与ATOL Online系统一起使用并且列表中的第一个是此服务的成熟客户端。 除了库本身之外,我们还发布了一个捆绑包 ,您可以使用该捆绑包将其轻松连接到基于Symfony框架的任何项目。 该库本身可以嵌入任何其他PHP框架中:Laravel,Yii等-只需为该库编写“包装器”即可。

2.预付款:与Payture的交互


为了处理预付款,我们与Payture服务进行了积极互动。 该服务具有多个软件接口。 我们使用Payture InPay选项,为此编写了自己的API客户端 。 该库允许您操作多个终端,支持标准PSR-3日志记录。 也可以使用预先配置的Guzzle客户端-这使得使用Guzzle Mock Handler进行组织测试变得容易。

我们的捆绑包提供了终端的语义配置,并允许您方便地为各种API操作配置客户端设置(到目前为止只有超时)。

3.产品标签:GS1 Datamatrix代码解析器


我们公司2019年最重要的项目之一是支持商品的国家标签。 作为该项目的一部分,特殊的唯一代码将应用于GS1 Datamatrix格式的某些类别的所有产品。 这些代码将使任何买家都可以验证商品的真实性,原产地和历史。 为了使Lamoda内部系统能够使用这些条形码,我们开发了一个来正确解析GS1代码。
在不久的将来,我们还计划布置我们已开发的客户的源代码,以与标记和可追溯性信息系统(IP MP)进行交互。

4.微服务管理:Tactician Team Bus的中间件


我们有一百多个微服务执行许多单独的操作:它们检查付款状态或存储中的新文件,将控制命令发送给收银员,从外部服务下载和处理照片。 几乎所有这些操作都是在后台执行的,命令总线模式非常适合管理它们。 为了在PHP系统中实现总线,我们选择了现成的解决方案-开放的Tactician库。

但是,出现了一个问题:我们的后台团队经常与外部服务进行交互,这在n秒内限制了操作数量。 而且Tactician没有能力在特定的时间范围内控制可执行命令的数量。 因此,我们开发了一个附加的中间件-Tactician速率限制库。 借助它的帮助,您可以添加一个新的处理层,该层根据所选的速率限制策略来跟踪总线上执行的命令数。 策略是可插拔的,即显式提供来自stiphle库的策略。

在公共领域中,我们的Symfony捆绑软件也包含在图书馆中。

5.收集和渲染Prometheus的度量标准


我们的微服务生成技术和业务指标,然后通过Prometheus Operator从整个k8s集群中收集这些指标。 为了管理所有这些,我们编写了一个 ,该根据“收集-保存-显示”方案处理自定义指标。 同时,该库支持可省略脚本项之一以提高效率的操作模式。 例如,对于快速可计算的度量,可以执行简化的“收集展示”方案。 使用缓慢的业务指标可以部分转化为后台,同时分为两个阶段:“收集-保存” +“收集(从存储)-显示”。

该库具有用于编写其度量标准生成器和用于编写存储库的必要抽象级别。 开箱即用的是适用于Doctrine的抽象适配器,可以在实体上对其进行配置以将数据保存到数据库。

作为度量渲染格式,当前支持prometheus和telegraf httpjson。

该库带有一个Symfony捆绑包,该捆绑包提供了度量标准源,存储库和路由度量标准的语义配置。 它还具有帮助程序命令,用于调试和保存来自源的度量标准(例如,用于计算cron度量标准)。

6.测试文件存储:使用不同的文件系统


为了使测试自动化,我们使用Codeception框架,该框架允许我们编写各种级别的测试,并具有相当广泛的标准模块库。 我们最近在另一篇文章中写了更多关于测试开发方法的文章,并在PHP Russia会议上发表了讲话。 Codeception具有与FTP和本地FileSystem交互的现成模块,但是在我们的测试中,需要使用更多的文件系统。 至少,我们还使用AWS S3和Webdav。 另外,我想使用相同的API与所有文件系统进行交互(这就是所有文件系统:))。

幸运的是,有一个开放的FlySystem库,它提供了一个用于处理不同文件系统的软件界面。 因此,我们只需要结合这两个工具-通过在FlySystem上编写一个包装程序(作为Codeception-flysystem模块)来完成 。 现在,它支持SFTP,S3和Webdav。 只需配置设置一次即可在yml测试配置中连接到所需的文件系统,然后您就可以使用同一组方法使用所有文件系统:写入文件,复制文件,清理目录等。 该模块已包含在Codeception的添加和建议页面中: codeception.com/addons

7.在多租户模式下使用环境变量


在业务流程自动化部门中,有些系统以多租户模式运行。 为了确保其工作,必须能够使用环境变量-确定当前要使用哪个变量。

我们的提供了几种在多租户模式下使用环境变量的策略。 根据在初始化阶段传递的参数,该库确定应在当前请求中访问哪个环境变量。

待续


这只是库的第一部分。 我们里面还有十几个-当我们对它们进行“梳理”并将它们放入公共区域时,它们正在排队。 这促使我理解这些库可能对其他人有用。 我对github上的评论和星标感到高兴,并希望继续与其他开发人员一起开发库。 确实,许多俄罗斯电子商务项目都与ATOL和Payture合作。 对于Datamatrix,除了本文所述的代码解析器外,我们还有一些内部已使用的客户端-这些库是GitHub队列中的第一个。

我们尽量不要忘记其他语言-我们已经在Go上发布了第一个库(我们在Habré上写了更多关于此的库),并且我们正在准备其他库。 敬请期待!

Source: https://habr.com/ru/post/zh-CN466039/


All Articles