惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
C
Cisco Blogs
博客园 - Franky
有赞技术团队
有赞技术团队
雷峰网
雷峰网
博客园 - 聂微东
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
NISL@THU
NISL@THU
P
Palo Alto Networks Blog
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
宝玉的分享
宝玉的分享
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
W
WeLiveSecurity
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
SegmentFault 最新的问题
博客园 - 【当耐特】
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 最新话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
The Last Watchdog
The Last Watchdog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
S
Schneier on Security
腾讯CDC
Google DeepMind News
Google DeepMind News
小众软件
小众软件
量子位
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hacker News: Ask HN
Hacker News: Ask HN
V
V2EX

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 5-3 会话 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-3 信号集 4-2 编写中断信号处理程序 2022-03-10 面试复盘 4-1 什么是中断信号(软中断) 3-7 进程查看 3-6 SUID特权进程 3-5多进程编写 3-4进程调度 3-3进程exec 3-2进程退出和回收 3-1进程标识与fork 2-3解释器文件 2-2命令行参数与环境参数表 2-1程序与进程 1-1课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇 第四章 定位篇 第三章 金钱篇 第二章 富人篇 第一章 财务自由篇 财富思维觉醒课前作业 This Set Cookie Was Blocked Because It Was Not Sent Over a Secure Connection 「转」Windows11右键恢复至Windows10模式 Ecshop 4.0 微信登录 一直循环授权登录 PHP判断指定日期是否为工作日 PHP Ajax 跨域请求允许多个域名 返回键劫持,强制跳转到指定链接 Chromium Adobe Flash Player下载 批量检查并清除BOM头 Ecshop之smarty与js冲突问题 Ecshop 广告位宽度值必须在1 1024之间 修改方法 PHP获取指定时区当前时间-PHP获取世界时钟 phpcms 更新栏目缓存 `PHP Has Encountered a Stack Overflow` 解决办法 php判断是否手机访问-php判断访问终端类型 丢了 如果昨天是明天的话就好了,这样今天就周五了 Ecshop自定义调用指定广告位 Destoon修改商务便签文字 Ecshop首页获取指定分类的推荐商品 QQ空间如何屏蔽好友刷屏广告 Css实现文字竖排 英尺(inch)、厘米(cm) JS转换 网页禁止鼠标右键 Destoon 选择支付方式 可单独关闭对联广告两枚 网页打开不是在最顶部,而是跳到中间位置解决方法 Ecmall iis 伪静态规则 Destoon 复制商城模块 QQ在线客服设置 QQ开启临时会话教程 Ecshop加入购物车js报错 IE浏览器“浏览器模式”和“文本模式” 网站图片在IE浏览器下不显示 Ecshop 去掉头部版权信息 echsop “transport.js/run() error:'process_request' 未定义”-解决方法 Ecshop Deprecated:Assigning the Return Value of New by Reference Is Deprecated in 报错解决方法 PHPCMS全局循环调用二级类目导航 如何使EditPlus打开tpl文件高亮显示代码 Ecshop前台英文后台中文实现方法 Ecshop安装报错warning:date_default_timezone_get() 1970年1月1日(00:00:00 GMT)Unix时间戳(Unix Timestamp) 黑莓bb微信 2.6 for os5 黑莓微信内测版问题总结及开发建议 360安全卫士卸载过程 管理距离AD值(Administrative Distance) 思科在中国的总代及金牌、银牌代理商 黑莓7100T拆机全程实录 CCNA静态路由配置实例 8700G国产壳白色,太粗糙了 黑莓7100T玉照曝光 黑莓手机电池的正确使用和保养 51啦统计不能打开,求分析,求解释 处女作,黑莓8707G4.2主题出炉 我的2011 Xweibo手机版底部版权修改 常用ping地址,逗逗搜索引擎,SEO必备 飞飞影视系统快播播放列表前缀修改 飞飞影视系统title修改 这才整明白啥叫被跨省,上网有风险,发帖需谨慎 为emlog添加Gravatar头像服务功能 三层交换机实现VLAN间通信 路由器的基本配置 路由器接口类型及连接方式 19岁双IE 谈Cisco认证 Secondary IP-Address 用途 儿童节NA战报 CCNA疑难解析之network x.x.x.x
2021-03-25 「PHP架构师」面试准备
王二 · 2022-03-24 · via WangDeer

岗位信息

职位:PHP架构师

工作职责:

  1. 负责应用类产品后端架构设计、开发与优化
  2. 负责业务整体设计,具有良好的维护性和扩展性
  3. 参与需求分析与评审,了解业务,从技术角度推进业务的安全、稳定运行

任职要求:

  1. 掌握微服务开发,拆分,saga事务模型
  2. 掌握消息队列
  3. 熟悉其他的语言
  4. 掌握docker,k8s
  5. 熟悉TCP、UDP、http协议
  6. 熟悉 linux 基础命令,了解如何排查系统性能瓶颈
  7. 熟练掌握mysql数据库的性能优化,表拆分
  8. 熟练掌握php,了解PHP的优势
  9. 统招全日制本科及以上学历,理工科专业。

知识点

saga 事务模型

概念

saga 是啥? 咱可没听过呀。

《传奇》是由布莱恩·K·沃恩(Brian K. Vaughan)撰写并由菲奥娜·斯台普斯(Fiona Staples)绘制的史诗般的太空歌剧/奇幻漫画系列,由美国公司Image Comics每月出版。该系列作品深受《星球大战》(Star Wars)的影响,并基于沃恩(Vaughan)既是孩子又是父母的想法。

—— saga

呃,貌似对找工作没啥帮助,既然是漫画先收藏起来。

再搜找到了以下相关的介绍:

1987年普林斯顿大学的 Hector Garcia-Molina 和 Kenneth Salem 发表了一篇 Paper Sagas(点这里可以看原文),讲述的是如何处理 long lived transaction(长活事务)。Saga 是一个长活事务可被分解成可以交错运行的子事务集合。其中每个子事务都是一个保持数据库一致性的真实事务。

—— 10分钟说透Saga分布式事务

The Saga design pattern is a way to manage data consistency across microservices in distributed transaction scenarios. A saga is a sequence of transactions that updates each service and publishes a message or event to trigger the next transaction step. If a step fails, the saga executes compensating transactions that counteract the preceding transactions.

Saga 设计模式是一种在分布式事务方案中跨微服务管理数据一致性的方法。 saga 是更新每个服务并发布消息或事件以触发下一个事务步骤的事务序列。 如果步骤失败,saga 将执行补偿事务,这些事务会消除前面的事务。

—— Saga distributed transactions pattern - Azure Design Patterns

You have applied the Database per Service pattern. Each service has its own database. Some business transactions, however, span multiple service so you need a mechanism to implement transactions that span services. For example, let’s imagine that you are building an e-commerce store where customers have a credit limit. The application must ensure that a new order will not exceed the customer’s credit limit. Since Orders and Customers are in different databases owned by different services the application cannot simply use a local ACID transaction.

Implement each business transaction that spans multiple services is a saga. A saga is a sequence of local transactions. Each local transaction updates the database and publishes a message or event to trigger the next local transaction in the saga. If a local transaction fails because it violates a business rule then the saga executes a series of compensating transactions that undo the changes that were made by the preceding local transactions.

你已经使用了 Database per Service 模型,每个服务有自己的数据库。然而有些业务的事务是跨多个服务的,所以需要一个实现跨服务的事务机制。 例如你在创建一个客户有信用限制的电商系统,系统必须确保新创建的订单不会超出客户的信用限制。但是因为订单和客户在不同服务的数据库中,系统就无法简单的使用本地 ACID 事务。

实现业务事务跨多个服务执行就叫 saga。Saga 是一个本地事务的序列。每个本地事务更新数据库,并发布一条消息或事件,以触发 saga 中的下一个本地事务。如果本地事务因违反业务规则而失败,那么 saga 将执行一系列补偿事务,这些事务将撤销之前本地事务所做的更改。

—— Sagas - Microservice Architecture

saga 事务有两种恢复策略

向前恢复(forward recovery):

对于执行不通过的事务,会尝试重试事务,这里有一个假设就是每个子事务最终都会成功。这种方式适用于必须要成功的场景。

向后恢复(backward recovery):

在执行事务失败时,补偿所有已完成的事务,是“一退到底”的方式。

saga 事务协调

Choreography(编排):

参与者(子事务)之间的调用、分配、决策和排序,通过交换事件进行进行。是一种去中心化的模式,参与者之间通过消息机制进行沟通,通过监听器的方式监听其他参与者发出的消息,从而执行后续的逻辑处理。由于没有中间协调点,靠参与靠自己进行相互协调。

优点:

  • 简单:每个子事务进行操作时只用发布事件消息,其他子事务监听处理。

  • 松耦合:参与者(服务)之间通过订阅事件进行沟通,组合会更加灵活

缺点:

  • 理解困难:没有对业务流程进行完整的描述,要了解整个事务的执行过程需要通过阅读代码完成。增加开发人员理解和维护代码的难度。

  • 存在服务的循环依赖:由于通过消息和事件进行沟通,参与者之间会存在循环依赖的情况。也就是A服务调用B服务,B服务又调用A服务的情况。这也增加了架构设计的复杂度,在设计初期需要认真考虑。

  • 紧耦合风险:每个参与者执行的方法都依赖于上一步参与者发出的消息,但是上一步的参与者的所有消息都需要被订阅,才能了解参与者的真实状态,无形中增加了两个服务的耦合度。

Orchestration(控制):

saga 提供一个控制类,其方便参与者之前的协调工作。事务执行的命令从控制类发起,按照逻辑顺序请求 saga 的参与者,从参与者那里接受到反馈以后,控制类再发起向其他参与者的调用。所有 saga 的参与者都围绕这个控制类进行沟通和协调工作。

优点:

  • 避免循环依赖:在编排模式中存在参与者之间的循环调用,而中心控制类的方式可以避免这种情况的发生。

  • 降低复杂性:所有事务交给控制器完成,它负责命令的执行和回复的处理,参与者只需要完成自身的任务,不用考虑处理消息的方式,降低参与者接入的复杂性。

容易测试:测试工作集中在集中控制类上,其他服务单独测试功能即可。

  • 容易扩展:如果事务需要添加新步骤,只需修改控制类,保持事务复杂性保持线性,回滚更容易管理

缺点:

  • 依赖控制器:控制器中集中太多逻辑的风险。

  • 增加管理难度:这种模式除了管理各个业务服务以外,还需要额外管理控制类服务,无形中增加了管理的难度和复杂度。而且存在单点风险,一旦控制器出现问题,整个业务就处于瘫痪中。

总结

首先Saga是针对分布式长活事务的解决方案,针对事务长、多、复杂的情况,特别是服务由多个公司开发具有不可控性,可以使用Saga模式进行分布式事务的处理。Saga在处理事务一致性方面采取了向前恢复和向后恢复策略,前者通过不断重试的方式保证事务完成,而后者通过子事务的补偿事务,逐一回滚的方式让事务标记失败。在分布式协调方面,Saga采用了两种模式:编排和控制。前者让参与者(服务)之间通过消息进行沟通,根据事件出发事务的执行流程,是一种去中心化的模式。后者通过中心控制类,处理事务的执行和回滚步骤,统一调用服务和接受服务的反馈。

微服务

Microservices - also known as the microservice architecture - is an architectural style that structures an application as a collection of services that are

  • Highly maintainable and testable(高度可维护、可测试)
  • Loosely coupled(松耦合)
  • Independently deployable(可独立部署)
  • Organized around business capabilities(围绕业务能力进行组织)
  • Owned by a small team(由一个小团队拥有)

The microservice architecture enables the rapid(快速), frequent(频繁) and reliable(可靠) delivery of large, complex(复杂的) applications. It also enables an organization to evolve(改进、演化) its technology stack.

—— Microservice Architecture

消息队列(Message Queue)

能够在服务集群中广播消息,并传递到每个服务中。具有这个功能的像是 NSQ 或是 RabbitMQ。你能够在 A 服务上广播一个“创建新用户”的事件,这个事件可以顺便带有新用户的资料。而 B 服务可以监听这个事件并在接收到之后有所处理。这些过程都是异步处理的,这意味着 A 服务并不需要等到 B 服务处理完该事件后才能继续,而这也代表 A 服务无法获取 B 服务的处理结果。与事件存储中心近乎相似,但有所不同的是:消息队列并不会保存事件。一旦事件被消化(接收)后就会从队列中消失,这很适合用在像发送欢迎信件的时机。

—— 微服务