出售的一切:我们如何为Lamoda建立业务流程并将其出售给合作伙伴

嗨,我是Lamoda BPA(业务流程自动化)负责人Pavel Saveliev。这是我们IT部门中最大的部门-9个团队,我们计划进一步扩展。我将告诉您有关我的开发部门的安排方式以及Lamoda的“幕后”内容。



简而言之,BPA是这样一个集中式网络,它结合了交付服务,庞大的仓库和订单管理系统以及与合作伙伴的开发和集成。所有这些都与报告和分析捆绑在一起。我们设计和编写所有服务,以实现这些系统的交互以及向合作伙伴提供类似服务。



图片



我们的IT部门与现实世界相遇:在IT系统中设置15分钟的交货间隔很容易,但是要确保莫斯科的数千名销售代表在此间隔内准确到达是非常困难的。我们部门的主要任务是将业务与技术联系起来。BPA部门本身现在位于三个领域:交付,仓库和商业职能,其中包括与B2B和市场的交互。而且,我们使用自己并在外部销售的所有东西都非常酷:我们的功能可带来收益,节省时间并为客户提供优质服务。



5种语言和200万行代码



图片BPA是一组相互集成的系统以及其他Lamoda系统。对于他们的开发,我们使用PHP,Java,Kotlin,还有一点Go和Typescript-我们的技术雷达上有5种语言。我们为业务任务编写所有系统。现在有200万行代码,25个服务和100多个可重用的库。



主要语言是PHP,其他一些大型服务则用Java和Kotlin编写。为什么要使用PHP?首先,它实现了一个订单处理系统-一个整体,我们已经在微服务中使用了很多年;其次,我们擅长使用PHP:我们在其中快速编写,很好地服务了它,并通过一堆库解决了它...这种方法使我们能够在短短几天内通过所有基础结构连接启动新服务:包括所有日志和监控。我们可以在仓库中同时使用Go和Kotlin。我们不会使用重复技术,并且只要可行,其他所有内容都不会被禁止。



在业务流程中,每个步骤的逻辑和周密性都很重要。这样就不会发生您的订单从仓库转到符拉迪沃斯托克(Vladivostok)的情况,并且系统中突然弹出一个意外的盘子,而该盘子没有发给您。



我们必须用测试覆盖每个步骤,因为系统逻辑执行的稳定性和正确性至关重要。此外,我们的合作伙伴还使用我们的业务流程。因此,尽管启动新服务的速度对业务也很重要,但公司的首要任务是保持稳定性。为了确保稳定性,我们会花时间设计服务和围绕它们的测试。这为我们提供了开发系统的机会,而又不会破坏所有内容。



甚至还有荞麦!



图片我是WMS-Lamoda配送中心管理系统或更简单的仓库的技术主管Anton Dmitrienko。



我的主要任务是与企业使用相同的语言,开发域模型并为系统进行更改做好准备。为此,您需要了解我们的“热点”在哪里。有些流程每三年排列一次,有些流程每三个月更改一次-这些都是“热点”。在设计系统时,必须考虑这些因素。



现在我有四个团队-18个人从事系统的创建,测试和支持。我们加快了仓库的所有运营和业务流程:如果没有我们当前Lamoda的业务量,则运送一张客户订单将花费大量时间,而我们的参与将任何订单的处理时间缩短至4小时。



图片



规模当然是非常大的:拉莫达仓库约4万平方米,分布在5层楼的几个足球场,可存储1000万种商品。它一年24天全天候工作,每年1月1日休息一天。每天有500多名员工离职,通过我们的系统,运输和接收了20万种商品。此外,在仓库内部部署了机械化的输送机和设备网络,该网络用于运输货物,包装包裹,实际合并客户订单,按装运方向对包裹进行分类,我们也对其进行管理。



图片



Lamoda向客户出售各种商品,从超大号雨伞和手提箱到小手表和珠宝。所有这些都在我们的仓库中存储和处理。每个类别都有其自己的特征。例如,超大型商品无法在自动化设备上进行处理,珠宝的存储和处理需要采取额外的安全措施,例如化妆品,香水需要一定的温度存储条件并控制商品的货架期。



最近,我们有一个名为“荞麦”的项目。自从实行自我隔离制度以来,拉莫达已在其产品系列中添加了流行的长寿命食品。顺便说一下,我们在短短几天内就实现了此功能。当然,主要的分类是衣服和鞋子,与之配合的工作也有一些细微差别:对于商品的销售,必须准备和检查其质量:例如,如果我们给客户带来没有纽扣的衬衫,那将是不好的。



Lamoda不仅是在线商店,还是功能完善的电子商务平台,可为外部合作伙伴提供其基础设施和服务(包括仓库)。例如,大型国际时尚品牌将商品存储在我们这里。有什么区别?合作伙伴的衣服,外套和鞋子与我们仓库中的相同。但是对于合同中必须遵守的流程,我们都有各自的要求,例如,一些大客户的商品存放在单独的区域中,而来自市场的物品遍布整个库存。还必须考虑这些功能。



我们在过程的每个阶段都要检查和处理每个产品,不仅要考虑物理世界,还要考虑IT系统的细节。此外,IT系统本身会提示仓库员工如何处理特定产品,因为操作员无法了解所有功能或协议:该产品未说明其属于谁:大型国际公司或小型市场合作伙伴。



图片



该系统的关键功能是通过扫描仪和条形码进行交互:每个产品都有唯一的条形码,可以读取该条形码以获得有关该产品的所有必要信息。这种方法最大程度地减少了错误,使您可以更快地对产品执行所有操作,从而减少了员工数量。如果我们每天发货20万件商品,那么在一种产品上节省1秒钟就是55小时的工作时间。对于企业来说,这是有形的。



在仓库的引擎盖下



我们的技术:



Java 8,

PostgreSQL,

Wildfly,

Spring,

Redis,

ActiveMQ,

Hibernate。



我们从Java的现成解决方案开始,但是从那时起,系统的功能得到了极大的扩展,并且代码已经被完全重构和重写了好几次。



现在我们有35万行代码-这只是主应用程序的后端,并且还有5个辅助服务和2个用户界面:瘦Web客户端和移动本机应用程序。我们正在进行全栈开发。



仓库员工使用移动客户端。他们使用我们自己的Android应用程序在仓库中移动,这是一种更现代,更方便的技术,可让您使用设备本身的功能:振动,声音错误,如果应用程序是本地应用程序而不是基于浏览器,则消耗的电池更少。该应用程序本身是用Kotlin编写的,我们在使用它方面有丰富的经验。我们甚至开始在其上编写后端:到目前为止,这只是一项服务,但是我们希望代码比Java中的代码更简单,更具表现力,并且性能相同。我们的目标不是重写Kotlin中的所有内容,但我们将继续将其用于适当的任务。



与其他Lamoda系统的交互是通过使用ActiveMQ消息代理以Apache Camel编写的数据总线构建的。这种方法为各种格式提供了有保证的传递和相对简单的消息转换,以及将消息分发给多个使用者的能力。我们在2014年是第一个使用Apache Camel的公司,然后该部门的其他团队采用了这种集成方法。

建立仓库系统的原则:



·可靠性和质量

·可扩展性和灵活性

·简单



仓库是Lamoda物流流程的核心,错误和系统停机对业务有重大影响。因此,我们密切关注系统的稳定性和容错性。通过复制关键的系统和基础架构元素来实现可靠性。我们有两个独立的服务器切成虚拟机。每个应用程序都部署在两个实例上,每个实例都在其自己的虚拟机上。客户端通过Haproxy形式的平衡器与服务器交互,该平衡器将请求路由到实例之一。还可以通过使用主从复制方案来备份数据库。



图片



我们所有的服务器都物理上位于仓库中,由于系统的所有元素通过本地网络进行交互,因此还提高了可靠性和工作速度。即使外部Internet中断,我们仍将继续工作,并且在断电的情况下,我们仓库中还拥有不间断的电源和汽油发电机。



为了最大程度地减少代码中的错误数量,我们编写了自动化测试:单元,集成,验收,负载,测试团队手动检查所有内容。所有这一切都是强制性的做法,并且已内置到任务的生命周期中,当然,有时会出现错误,但是几年来我们一直没有完整的版本回滚。



可扩展性和灵活性-对我们来说,这主要是一个问题,我们将花费多少精力和时间来更改系统以满足业务流程的新要求。因此,该开发提供了在将来快速,轻松地更改代码的能力。例如,可以为特定的物理存储位置配置任何类别的商品,这使您可以快速连接新的类别的商品进行销售。对于每个订单,它都将配置为使用哪种材料包装以及将打印哪些随附文件。这只是功能的一小部分。



我们拥有一个复杂的主题领域,其中包含大量业务流程和一个分支域模型。代码越简单越好,因为它提高了代码的可读性,可理解性并减少了出错的可能性。而且,它使您可以更专注于代码为业务执行的功能。



错误保险



图片我叫Denis Plisko,我是BPA交付服务的开发主管。



我们已经创建,开发和维护LM Express IT系统。它用于使转运仓库,销售代表和订单发布点的工作自动化。我们的系统了解有关交货的到达和离开的所有信息,处理其处理,出售和发出已付款订单,接受退货和许多其他相关业务流程。此外,在其中,我们记录并分析了销售代表和仓库工人的实际行为-在货物移交给买方之前,我们跟踪“最后一英里”发生的一切。 Express系统中信息表中的大多数技术过程都反映了交付服务员工的身体行为。



图片



它是什么样子的?例如,一名员工接受交货,从中取出一个托盘-一个装有货物包装的盒子,取出包装,将它们分类到架子上:他所做的每项动作都伴随着我们系统中的一项操作。这就是可能出现错误的地方:您永远无法确定,即使送货员工正确地“点击”了所有内容,也是如此。结果,我们流程逻辑中最大的部分之一就是警告和纠正错误:有时这可以自动完成,有时可以通过人员本人完成,有时可以通过帮助台或拥有更高级权限的用户来完成。如果没有这些功能,那么我们的系统将缩小5倍。

构建交付系统的原则:



·系统的稳定性和可用性

·数据一致性

·与外部系统和服务的独立性



任务是确保系统最稳定的运行,因为人们是否准时收到购买商品直接取决于此。在实现任何功能时,我们试图独立于外部服务和系统,为此,许多交互都是重复的。假设交货已经到达,并且没有订单数据,那么我们将自己请求此信息,以免停止工作。为了保持必要的数据一致性,尤其是与其他服务进行交换时,使许多操作幂等也很重要。



此外,我们努力尽早接收所有必要的数据,以确保没有人因为某种产品而来,并且由于系统故障而无法接收该产品。我们努力使系统的内部部分非常可靠,以便用户与它们的交互仅取决于我们自己的服务。因此,即使所有Lamoda系统暂时无法使用,仓库和取货点的工作也不会停止,并且主要操作将继续。



在大街上快递员



除了自己的交付外,拉莫达还与第三方快递服务合作,例如Russian Post,Pony Express,DPD等。在城市,地区或国家(例如在乌克兰),只有通过合作伙伴才能交付我们的产品时,就会发生这种情况。我们通过与他们的IT系统进行交互来提供信息交换。



连接每个新的快递员都是一次激动人心的冒险,因为每个人的API都有很大不同,并且并不总是适合集成。这是因为某些快递服务历来是离线公司。自文书工作以来,他们就一直在发货,而编写良好的API绝非易事。



我们使用基于ESB框架Apache Camel的特殊系统来实现与新合作伙伴的集成。使用Camel可以很容易地通过不同的交换协议执行各种数据转换和交互。通常,与新的快递服务建立集成需要两个星期到一个月的时间。



交付是我们与仓库一起出售给合作伙伴的服务之一。如果从流行服装品牌的在线商店订购与Lamoda无关的产品,则销售代表将以LM Express的形式交付。我们正在与商业职能团队一起致力于这些项目。



为了实施我们的业务项目,我和我们的2个团队的技术负责人(第三个团队现在正在招聘开发人员和测试人员)正在确定如何最好地将所有更改适应我们的当前体系结构。



我们以项目列表中的积压工作为基础。商业会根据财务和营销效果评估每个项目。我们估算劳动力成本,然后考虑一种技术方法:是否可以快速有效地创建新功能,或者相反,它是如此昂贵和困难,以至于阻碍了整个业务。根据这些估计,我们调整积压订单,并将项目放在列表的顶部。我们约有30%的开发时间分配给技术积压,因此无需从技术角度花费时间重构和改进系统,一切都按计划进行。



交付的内心世界



:



· PHP,

· Java,

· Kotlin,

· TypeScript,

· MySQL,

· PostgreSQL,

· RabbitMQ,

· ActiveMQ,

· Apache Kafka,

· Apache Camel,

· Docker, K8S.



我们的大多数服务都基于PHP构建。历史上,创建Lamoda的系统都是用这种语言编写的。该网站的第一个版本是在Magento中创建的,然后将Rocket Internet系统作为订单交付和处理的基础。他们经历了开发和返工的许多迭代,但是PHP仍然是几乎所有服务(包括新服务)的基础。我们已经编写了约20万行代码,并且有许多经验丰富的PHP开发人员(交付方向以及质量保证工程师人数达到20人,并且正在积极扩展)-但它们不仅限于一种技术,而且他们还是出色的工程师,他们为任务选择了合适的工具。



我们不会在后端放弃PHP,因为我们已经在其上开发了良好的开发文化:我们使用语言和框架的新版本,使用测试覆盖几乎所有代码,进行全面的代码审查,拥有完善的CI和许多可加速的通用库开发过程。



与在线商店不同,我们没有与RPS相关的大量负载。首先,我们需要一个复杂而灵活的应用程序体系结构,该体系结构具有大量抽象级别(我们尝试遵守DDD)以应对复杂的业务逻辑,有时还会使业务逻辑混乱。与其他系统的同步交换(JSON-RPC,SOAP)和异步交换(RabbitMQ,Apache Kafka)也很多。



尽管有时我们使用Java,但总体上约有80-85%的系统是用PHP编写的。它包含用于与外部交付服务进行交互的服务,我们正在不断地对其进行更改。



前端由一捆VueJS + TypeScript表示。我们的内部用户管理面板不需要超级布局或复杂的设计。



我们还为销售代表提供了一个移动原生应用程序,该应用程序是用Kotlin for Android编写的。它曾经是由专门的移动开发人员开发的,但是现在我们非常成功地自行开发了它。



图片



对于在转运仓库工作的员工,从那里将订单发送到俄罗斯的所有仓库和取货点,我们都有一个Web应用程序。使用这种方法,由于在特定的取货点或仓库中Internet的断开连接,存在我们的应用程序无法使用的风险,但是我们通过保留通信通道将其最小化。



除了这些交付系统(Express和移动应用程序,用于与外部快递服务集成的总线)之外,我们的团队目前还支持两项服务打印电子收据和Datamatrix的服务... 后者旨在确保根据法律的新要求对商品进行唯一编码。这两个项目与交付没有直接关系,但是通过我们的服务可以交换它们所需的数据。



送货服务打印收据:每个销售代表都有一个收银台,此外,我们的每个提货点都设有收银台。因此,税收服务不断与我们的系统互动。Datamatrix影响几乎所有BPA系统(仓库,运输,合作伙伴关系,会计系统)。我们的部门也非常积极地与他互动,因此我们积极参与了其发展。目前,我们正在开发针对销售代表的激励政策的新系统。



BPA的商业功能:我们的销售



该公司有一个宏伟的目标-成为CIS中最好的时尚平台。为此,拉莫达在服务质量上进行了大量投资,并从零开始提高了运营流程:交付,仓库,照相馆,联络中心操作员的工作。所有运营流程均已通过客户测试和测试。我们进行了实验,监控了客户的反馈,犯了错误,修复了错误,不断改进了可以改善在线购物体验的一切。在公司成立的第五年,我们决定准备与其他市场参与者分享我们的资源和专业知识。



因此,我们拥有第一个B2B方向,即为大型合作伙伴提供摄影工作室服务,商品的存储和交付以及客户致电。不久,公司内部出现了一个针对中小型公司的市场,该市场提供了Lamoda展示柜,作为以前列表的附加服务。这两个方向实际上是并行工作和发展的,在服务范围上相互追赶和超越。



又过了三年,并在评估结果之后,决定将B2B和Marketplace合并为一个商业功能,该功能基于现有Lamoda内部服务为外部合作伙伴创建,开发和支持服务。



现在,我们正在与大约20个大型品牌合作-这些都是具有全球声誉的跨国公司,它们都有自己复杂的业务流程。我们的另外1000个客户是中小型公司,这些公司通常没有发达的IT基础架构。对于所有合作伙伴,我们都维护一个单独的集成层,该层旨在快速,灵活地开发将外部流程转换为我们的功能的功能。



图片我是解决方案架构师Alexey Felde,负责Lamoda商业功能的技术和产品开发。



我从事集成层中服务的开发和支持,为此,我需要透彻了解公司及其合作伙伴的业务流程,以便设计Lamoda系统中的任何更改。



如上所述,我们正在开发与品牌互动的两个主要领域:小品牌市场,我们以单独的WEB应用程序的形式提供SAAS解决方案; B2B-大品牌全球的独立大型项目,我们可以完全提供其运营能力,或者我们帮助与我们整合。



B2B方向是公司中最有趣的方向之一,但同时也是最困难的方向之一。碰巧世界时尚巨头对我们提出了全新的要求或整合限制。在这种情况下,我的团队会与其他Lamoda团队互动,并且我们会设计对所需的任何公司服务的更改。为了联系全球时尚行业的一位领导者,我们需要将自己融入到其所有业务流程中,包括会计和运营。在该项目的框架内,我们涉及了15个内部流程:从现场的商品描述到会计和交付。我的团队在运营Lamoda IT系统和业务流程方面拥有最广泛的专业知识。这需要对我们的知识进行仔细的系统化和记录。



对于通常没有自己的IT部门的小型服装,鞋类和配饰制造商,我们提供了盒装市场解决方案,可让您跟踪销售,货物移动,退货。它完全可以在我们系统的设施中工作:商品的照片由我们的照相馆拍摄并与我们一起存储,货物实际上不在客户家中,而是在我们的仓库中,由Lamoda送货服务运送。



我们附带的带源代码的盒装产品是照相馆。它是几年前由一家大型奢侈品零售商购买的。他们的网站上有非常不同的照片,这极大地影响了销售转换。我们的工作室使用照片进行了大量测试:哪个测试卖得更好(男人没有头或有头的男人的照片,正确的下肢角度等)。客户真的很喜欢这些测试的结果,他想在他的在线商店中应用我们的经验。为此,他需要建立一个类似于我们的摄影棚,人们可以在那里工作,组织摄影过程并安装我们的IT系统。



拉莫达缩影



与服务团队相比,我们有不同的任务-集成层的开发,该集成层隐藏了大公司的企业。主要产品是B2B平台,该平台在代码级别上在内部分为模块:用于仓库的模块,用于交货的模块等。这是一个大系统,可以在这些小模块的级别上管理某些服务。事实证明,我们的平台是微型Lamoda。同时,合作伙伴只能看到一种API-通用且非常简单,在其后面隐藏了Lamoda的所有复杂性。同时,我们必须尽可能简单地进行集成-我们开发的第一个原则就是稳定性和可靠性。我们支持各种SLA,例如,其中之一是每年最多4小时的系统停机时间。像同事一样我们非常关注容错,发布流程,代码质量,功能测试的覆盖范围等任务。就测试数量而言,我们的B2B平台几乎是清单上的第一个系统,我们有2,000多个功能测试和3,000单元测试。

B2B :



·

·

·

·





:



· PHP,

· Java,

· JavaScript,

· GO,

· Symfony,

· Camel,

· PostgreSQL,

· AngularJS,

· Apache Kafka,

· RabbitMQ.



在连接品牌之前,我们与合作伙伴就关系的所有细节达成协议:商品的范围和预期数量,交付的地理位置以及所提供的服务组合。接下来,IT组件发挥作用:与品牌讨论集成细节,我们帮助连接到我们的API。如果与标准集成方案有所不同,那么我们还会在合作伙伴系统和我们的B2B平台之间提供中间件服务。



我们有90%的时间升级平台并实施新的业务流程。最后实现的业务流程是使用Datamatrix代码,上面已经在另一篇文章和同事中讨论过



在我们的工作中,最主要的是保持技术平衡并为要解决的任务选择工具。老实说,我们不追逐时尚界。我们的堆栈是PHP,Java,Javascript和一些Go语言。



图片



如文章所述,该公司历来使用PHP编写了许多系统。在其上编程业务流程既方便又快捷。我们的B2B平台的基础就是上面写的-授权,角色管理以及所有主要业务流程。它基于六边形体系结构,积极使用DDD和API优先设计。我们支持以Angular 1.5编写的单页应用程序。它通过API与我们的B2B平台进行通信,并且主要负责为我们的员工和合作伙伴员工呈现UI。



我们还使用Java,特别是Camel集成框架。品牌并不总是准备使用我们的API,并且对于非常大的参与者,我们编写了将中间件转换为Lamoda的中间件。 Camel节省了开发系统集成解决方案的时间,使用企业集成模式(EIP)将人们的观念转变为良好的工程实践。我们计划在使用集成模式比编写单独服务更方便的地方开发Camel。



我们积极使用Kafka在内部系统之间交换数据。这大大降低了系统之间的连接性,因为在我们的工作细节中,我们需要存储所有为合作伙伴优化的系统的数据快照。对于需要快速完成的所有事情和办公任务,我们使用Go编写。我们的一项服务会根据存储的数据每分钟计算一次指标。以前,此解决方案内置于B2B平台中,并且是用PHP编写的,但我们将其重写为灵活的Go,因为它具有更高的性能,更容易的支持,可以更好地扩展,并且可以在B2B平台的发布周期之外进行部署。



当我在大型和著名时尚品牌的30多个第三方站点上看到我们平台的工作成果时,我感到非常高兴。我看到了我们的联络中心操作员如何处理从其他人的网站放置在我们系统中的订单,然后通过我们的送货方式进行运输。没有人知道所有这些流程都是在Lamoda中创建和自动化的,但是我们做得如此酷,以至于我们的流程被全球品牌购买。



All Articles