Laravel 如何设计微服务架构,及如何进行微服务间沟通? | Laravel China 社区

如题,我目前有需要用 Laravel 设计微服务架构的需求,但能找到的相关资料不多
目前已有的一个思考方向是使用 K8S 统合各个独立的 Laravel 小服务,再开放统一对外的 API Gateway
但碰到一个问题是各个服务间要如何在不发生耦合的状况下沟通

举例来说:订单发生后需要减少库存,若库存成功扣除后要再告诉订单更新状态
我目前想到三种解决方式:

  1. 在 API Gateway 处理流程问题,等订单服务回传成功后,再呼叫库存服务。
    好处:流程简单直觉、使用者当下就可知道订单结果
    坏处:API Gateway 会发生强耦合、API Gateway 会出现状态,违反微服务的 Stateless 原则
  2. 在订单服务的建立方法中直接呼叫库存服务
    好处与坏处都跟方法一差不多,但更多的坏处是微服务本身会变复杂、与其他服务发生强耦合,且违反微服务间不能直接沟通的原则
  3. 借由某种广播机制,在订单建立完成后,由订单服务发出「订单建立成功」的广播,告诉其他服务有订单建立。库存服务接收到广播后就会扣除库存,并再次发出「库存扣除成功」的广播,由订单服务再次接收。而其他不相干的服务就会忽略广播。
    好处:各服务完全解耦,彼此只借由单次事件进行沟通,不会在双方服务留下状态,且后续有逻辑改动只需要调整事件即可,不用动服务主逻辑
    坏处:无法及时告诉使用者订单产生结果,会造成较差的使用者体验

我目前想采用的是第三种模式,因为我司目前还处于新创阶段,功能仍在快速调整,因此开发上最好能像电源一样快速插拔,若服务出现强耦合就会降低产品调整的速度。相较之下,第三种方法造成的使用者体验降低都还可以接受。
我搜寻过后似乎有「Message Queue」这种解法,但有点不明白它如何用 Laravel 实作,且有一部分文章来源表示 Message Queue 已经是过时的技术
想请问有没有人设计过微服务架构,或曾经碰过类似的状况能给我一些建议,谢谢

---------------------- 4/3 补充说明

我发现我之前对 Message Queue 的理解有错,因此上来补充说明
我之前对 Queue 的机制,是认为他注册的事件是一段程式码,等待 worker 执行
但 Laravel 的事件机制,实际上是由 Event 注册事件名称及相关资料,等 worker 空闲后,呼叫 Listener 接收事件
Event 注册的资料如下所示

array (
  'displayName' => 'App\\Mail\\SaveAsDraft',
  'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',
  'maxTries' => NULL,
  'timeout' => NULL,
  'timeoutAt' => NULL,
  'data' =>
  array (
    'commandName' => 'Illuminate\\Mail\\SendQueuedMailable',
    'command' => 'O:34:"Illuminate\\Mail\\SendQueuedMailable":3:{s:8:"mailable";O:20:"App\\Mail\\SaveAsDraft":20:{s:29:"' . "\0" . 'App\\Mail\\SaveAsDraft' . "\0" . 'service";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":3:{s:5:"class";s:18:"App\\ServicePackage";s:2:"id";i:522;s:10:"connection";s:5:"mysql";}s:4:"from";a:0:{}s:2:"to";a:1:{i:0;a:2:{s:4:"name";N;s:7:"address";s:21:"mengluyange@gmail.com";}}s:2:"cc";a:0:{}s:3:"bcc";a:0:{}s:7:"replyTo";a:0:{}s:7:"subject";N;s:11:"' . "\0" . '*' . "\0" . 'markdown";N;s:4:"view";N;s:8:"textView";N;s:8:"viewData";a:0:{}s:11:"attachments";a:0:{}s:14:"rawAttachments";a:0:{}s:9:"callbacks";a:0:{}s:10:"connection";N;s:5:"queue";N;s:15:"chainConnection";N;s:10:"chainQueue";N;s:5:"delay";N;s:7:"chained";a:0:{}}s:5:"tries";N;s:7:"timeout";N;}',
  ),
  'id' => '1',
  'attempts' => 0,
  'type' => 'mail',
  'tags' =>
  array (
    0 => 'App\\ServicePackage:522',
  ),
  'pushedAt' => 1514296314,
)

里面并无存放任何程式码,仅告诉 Listener 要做什么,用什么去做,剩下的逻辑都是在 Listener 里面

所以针对我上面提到的 Message Queue 机制,可以如下设计

  1. 以 AWS 来说,各个微服务都会有自己对应的 SQS,事件产生时,将事件发送到 SNS,SNS 就会广播到所有 SQS,并由各服务各自处理队列
  2. 若非使用 AWS,而是自架 Message Queue,就是自己架个 Message Queue Service,里面的 Redis 为集群,收到广播事件后就一次写入集群所有 Redis,再由各服务执行

思路上大概如上,但未经过实作,待实作过后会再上来补充说明

簡永哲 Leo Chien IT Director | 大師鏈 MasterChain E: s950329@hotmail.com                                 
(0)

相关推荐

  • Laravel 队列使用

    Laravel 队列使用

  • 微商订单管理系统开发功能架构

    微商订单管理系统开发功能架构有什么特色?如何能实现传统企业信息化管理呢? 一.微商订单管理系统是什么流程? 1.品牌灵活设置分销订货价格 代理依据账号信息作为登陆辨识会员,登陆微商订单管理系统后,可对 ...

  • 初次使用 Supervisor 管理 Laravel 队列进程

    #yuxiangShi/学习/php/laravel/使用Supervisor管理Laravel队列进程 下载Supervisor yum install -y supervisor1 Supervi ...

  • 微服务架构下的API接口驱动开发,设计和集成

    今天谈下在微服务架构下,接口设计和开发方面的思考. 对于微服务架构,SOA和Http Rest API接口设计,在我前面的头条文章中均有专门的说明,因此对于基础方面的解释在本文不再重复.对于今天要写的 ...

  • 微服务架构设计实践系列之九:应用架构

    微服务架构设计实践  目    次1 序言2 微服务3 软件架构设计思想4 微服务架构设计实践4.1 项目概述4.2 架构准备阶段4.3 概念架构阶段4.4 细化架构阶段4.4.1 业务架构4.4.2 ...

  • 微服务架构设计总结实践

    架构师(JiaGouX) 我们都是架构师! 架构未来,你来不来? -     目录    - 一.微服务架构介绍 二.出现和发展 三.传统开发模式和微服务的区别 四.微服务的具体特征 五.SOA和微服 ...

  • 如何在微服务架构下进行数据设计?

    作者:唐建法 && Mongoing中文社区 来自:http://www.mongoing.com/ 微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微 ...

  • 微服务架构设计实践总结和思考

    微服务架构核心 再次强调,微服务架构核心是传统单体应用大拆小,同时拆分为小的微服务后相互之间以轻量的API接口进行通信.而这个拆分本身又分了多个方面. 开发团队的拆分 代码层的拆分,可独立构建打包 数 ...

  • 微服务架构下的高可用和高性能设计

    今天再谈下微服务架构下的高可用性设计. 对于高可用性实际应该包括了高可靠性,高性能和高扩展性.因此谈微服务架构的高可用性,首先需要梳理三者之间的关系. 高可用性三个维度和相互关系 对于业务系统的高可用 ...

  • 诚之和:如何理解微服务架构下的高可用和高性能设计

    这篇文章主要讲解了"如何理解微服务架构下的高可用和高性能设计",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解微服务 ...

  • 微服务架构设计中的设计模式、原则及最佳实践

    作者 | Mehmet Özkaya 译者 | 平川 策划 | 闫园园 来源丨AI前线(ID:ai-front) 本文既有理论知识,又有实用信息:我们将学习每一种具体的模式,为什么以及应该在什么地方使 ...

  • 一文了解四种软件架构:Serverless架构、微服务架构、分布式架构、单体架构

    如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存.晋升空间.这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面. 一.单体架构 单体架构 ...