想象你经营一家叫“幸福小馆”的餐厅。客人有三种方式下订单:一是直接到前台点单,师傅立刻做、做完端上桌;二是把订单条投进门口的外卖箱,师傅忙完手头这波再去取;三是通过店里的广播站喊一声“需要临时加菜”,感兴趣的档口听到后自行响应。这三种方式,恰好对应 Serverless 世界里最经典的三种事件源触发:API Gateway(前台点单)、SQS(外卖箱)、EventBridge(广播站)。它们都在做同一件事——把外部世界发生的“情况变化”告诉你的函数——但节奏、风格、承诺完全不同:有的要求立刻回答,有的允许慢慢消化,有的只对特定声音做反应。这篇文章就用“幸福小馆”的故事,带你搞懂事件源触发的核心概念、三种触发器的差异、消息语义保证,以及多事件源编排的工程实践。

岗位关联

理解事件源触发是云原生与 Serverless 工程师的核心基本功。你将在真实项目中,根据延迟、吞吐、可靠性的不同诉求,为业务选择最合适的事件源组合,并设计出高可用的触发链路。

目录
  1. 可视化演示
  2. 事件驱动本质
  3. 网关触发
  4. 队列触发
  5. 事件路由
  6. 触发模式对比
  7. 语义保证
  8. 编排与容错
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示API Gateway同步请求、SQS消息队列消费、EventBridge事件总线路由三种事件源触发Lambda的流程,可切换模式观察同步与异步语义。

本节配有交互动效(进入视口后自动加载,约 3KB)。

API Gateway:同步触发 客户端HTTP请求经API Gateway同步转发Lambda 客户端在Lambda执行期间阻塞等待响应 同步 = 请求→执行→响应 适合REST API与Webhook,需命中及时返回。

事件驱动本质

在“幸福小馆”里,什么叫“一个订单”?不是顾客走进门那一刻,而是“某件事发生了变化”——比如顾客点了一份红烧肉、外卖箱里多了一张订单条、广播里说缺了青椒。这些变化本身,加上变化携带的信息,合在一起就是一个事件。事件不是一个动作,而是“已经发生了某个事实”的记录。

在 Serverless 世界里,事件驱动模型正是这样运转的:某个系统或服务发生状态变化,产生一条事件,事件被送到触发器,触发器再把事件转交给函数去处理。事件可以来自 HTTP 请求、数据库变更、文件上传、定时器,甚至是另一个函数。而 FaaS(函数即服务) 的核心机制,就是“无事不调用”——没有事件,函数就安静地待着;一旦事件到达,平台立刻拉起函数实例处理。

回到小馆:前台喊“红烧肉一份”,如果只喊菜名不带桌号,后厨就不知道该送给谁。事件也一样,变化和数据缺一不可。理解这一点,你就踏进了事件驱动世界的大门——后面所有触发器的故事,都是从这条等式开始的。

事件=状态变化+数据载荷\text{事件} = \text{状态变化} + \text{数据载荷}
和餐厅里的“订单”一样,事件由两部分组成:发生了什么(状态变化)+ 相关的细节(数据载荷)。
  1. 状态变化(发生了什么)某个系统内部发生了值得注意的变动,比如“订单状态从待支付变为已支付”。
    状态变化\text{状态变化}
  2. 数据载荷(细节信息)携带描述这次变化的上下文,比如订单号、金额、用户 ID 等。
    数据载荷\text{数据载荷}
  3. 事件 = 两者之和只有变化没有数据,函数不知道要怎么处理;只有数据没有变化,那就只是一条普通数据而非事件。
    事件=状态变化+数据载荷\text{事件} = \text{状态变化} + \text{数据载荷}

网关触发

前台点单是“幸福小馆”最直观的接单方式:顾客走到前台,报出菜名,师傅当场开火,做好后端上桌,顾客拿到菜才算完事。这种“一问一答、立刻见分晓”的模式,就是 API Gateway 触发 Lambda 的写照。

API Gateway(API 网关)是云上的一道正门:它接收 HTTP 请求(比如 POST /orders),把请求转换成事件,同步调用你的 Lambda 函数,然后把函数的返回值转换成 HTTP 响应交还给客户端。整个过程是同步调用——客户端发起请求后,必须等待函数执行完毕拿到结果。这个模型适合在线交互场景,比如用户登录、下单、查询余额,这些都需要“立刻知道答案”。

既然是同步等待,我们就得关心一个关键问题:要支撑多少并发?如果每秒进来大量请求,函数能不能接得住?

前台点单的好处是响应快、逻辑简单,但代价是后厨必须“随叫随到”。如果顾客下单太猛,师傅就得不停加灶台——对应到 Serverless 里就是并发数飙升、成本上升。所以,API Gateway 适合那些真的需要即时回答的业务,而“不需要立刻吃上饭”的订单,放进外卖箱更合适。

C=⌈QPS×T1000⌉C = \left\lceil \frac{QPS \times T}{1000} \right\rceil
并发数等于每秒请求数乘以单次执行时长(毫秒),再向上取整。它回答“同时需要多少个函数实例在工作”。
  1. QPS(每秒请求数)网关每秒转给函数的请求量,比如 200 次/秒。
    QPSQPS
  2. T(平均执行时间)函数单次处理请求平均消耗的毫秒数,比如 250ms。
    TT
  3. 乘以并除以 1000(时间归一)把毫秒换算成秒,让 QPS 和耗时在同一时间维度上运算。
    QPS×T1000\frac{QPS \times T}{1000}
  4. 向上取整函数实例数必须是整数,多一点总比不够好。
    ⌈⋅⌉\left\lceil \cdot \right\rceil

队列触发

“幸福小馆”门口挂着一个大外卖箱。顾客把写好的订单条丢进去就走了,师傅不急着去拿,而是等手头这波堂食忙完,再去箱子里一把抓出几张订单条,集中做。这就是 SQS(简单队列服务) 的节奏。

SQS 是一个托管消息队列。生产者(Producer)把消息放进队列,队列把消息暂时存起来;Lambda 作为消费者(Consumer)定期从队列里“捞”消息。因为有队列这个缓冲层,生产者和消费者彼此解耦——即使消息突然暴增,队列会先攒着,消费者量力而行,不会把系统冲垮。

SQS 触发 Lambda 时,平台采用“拉取—批处理—调用”的模式。你可以配置两个重要参数:BatchSize(每批最多几条消息)和 MaximumBatchingWindow(最多等多久凑一批)。比如设置每批 10 条、最多等 5 秒,那么队列里哪怕只有 2 条,也会在 5 秒后被取走处理。

外卖箱模式之所以好用,在于“缓冲”二字——它天然扛得住流量洪峰,消费者可以按自己的节奏批量处理。代价是延迟增加了:顾客点完外卖不能立刻拿到餐。但很多业务(如发通知、处理日志、数据清洗)根本不需要秒级响应,把它们放进 SQS,就是给系统装了一个“压力缓震器”。

Bactual=min⁡(Bmax, Qdepth)B_{\text{actual}} = \min(B_{\text{max}},\ Q_{\text{depth}})
实际每批处理的消息条数,取“最大批大小”和“队列当前积压量”两个值中较小的那个。
  1. B_max(最大批大小)配置里规定的每批消息条数上限,比如 10 条。
    BmaxB_{\text{max}}
  2. Q_depth(队列深度)队列里当前等待处理的消息数量,可能只有 3 条。
    QdepthQ_{\text{depth}}
  3. min(取较小值)实际取出的消息数不超过上限,积压少就少拿,积压多也不贪心。
    min⁡(Bmax, Qdepth)\min(B_{\text{max}},\ Q_{\text{depth}})

事件路由

“幸福小馆”装了一套广播系统。店长对着麦克风喊:“红烧肉的葱不够了,谁补一下!”,听到的档口会自己判断“这关我事不关我事”——备菜间去补葱,收银台不会跑去做菜。这就是 EventBridge(事件总线) 的工作方式。

EventBridge 的核心是事件总线:各种事件源(如云服务、自定义应用、定时器)把事件发送到总线,总线根据规则把事件路由到合适的目标(比如 Lambda 函数、SQS 队列、HTTP 端点)。和 SNS 那种“广播给所有人”不同,EventBridge 的规则可以做精细的字段匹配——比如“只把金额大于 1000 的订单事件发给风控函数”。

一个事件带上 source(来源)、detail-type(事件类型)、detail(具体数据)等字段。规则就像一连串筛子,逐层过滤事件。命中规则的事件,才会被投递给目标;没命中的,就静悄悄地在总线上消失。

广播模式最迷人的地方是解耦:事件生产者根本不需要知道谁在听。小馆的店长喊完广播,不用挨个通知备菜间、收银台——谁关心谁响应。这种“发布—订阅”思想,让系统里各个模块像乐队各声部一样,各自独立又彼此合拍。

M=E×rM = E \times r
匹配事件数量 = 进入总线的事件总数 × 规则通过率。规则越严,通过率越低,被触发的函数越少。
  1. E(事件总数)进入总线的事件总量,比如一天 10 万条。
    EE
  2. r(规则通过率)满足匹配条件的事件比例,比如 30%。
    rr
  3. M(匹配数)真正被路由到目标的事件数量,也就是函数实际被触发的次数。
    M=E×rM = E \times r

触发模式对比

三种接单方式各有脾气。前台点单快但费人力,外卖箱能扛量但慢,广播灵活但需要大家自觉听。选择哪种,本质上是在问:这个业务更在乎什么?

API Gateway 同步触发的显著特点是低延迟、强一致——客户端立刻拿到结果,适合用户在线交互。SQS 异步触发的特点是高吞吐、强缓冲——流量再猛也有队列顶着,适合批量处理、削峰填谷。EventBridge 事件路由的特点是高灵活、强解耦——它不关心“谁发起”,只关心“规则是否匹配”,适合系统内部事件广播和复杂路由。

延迟上,API Gateway 最快(几百毫秒级);SQS 因为有轮询间隔,通常有几秒延迟;EventBridge 介于两者之间。吞吐上,SQS 凭借批量处理能力,可以吸收极高的消息量;API Gateway 的吞吐受函数并发限制;EventBridge 在匹配后把事件推给目标,吞吐很高但受目标自身约束。

选型时,可以用一个简单的加权评分模型:

这就好比小馆选外卖策略:高端餐厅追求体验,必须前台现做现吃(同步);快餐店追求出单量,多接外卖单(异步);连锁店要协调多家分店,则靠总部的广播调度(事件路由)。没有最好的触发器,只有最合适的组合。

S=∑i=1nwi⋅siS = \sum_{i=1}^{n} w_i \cdot s_i
加权评分 = 把每个指标(延迟、吞吐、成本、可靠性)的评分乘以对应权重,再求和。分数最高的方案,就是最适合业务的方案。
  1. 权重 w_i(重要性)每个指标在业务中的权重,比如延迟权重 0.5、成本权重 0.3。
    wiw_i
  2. 评分 s_i(表现)每种触发器在指标上的打分,比如 SQS 的吞吐分 9 分、延迟分 4 分。
    sis_i
  3. 加权求和把“重要性 × 表现”累加起来,得到总分。
    ∑i=1nwi⋅si\sum_{i=1}^{n} w_i \cdot s_i

语义保证

“幸福小馆”对顾客有个朴素的承诺:你的订单绝不会丢,但有可能多做一份。这不是偷懒,而是分布式系统的现实——当 SQS 把消息投递给 Lambda 函数后,如果函数执行中途超时或崩溃,SQS 不会知道消息是否处理成功,于是会把消息重新放回队列,再次投递。这就是至少一次语义:每条消息保证会被处理,但不保证只处理一次。

正因为消息可能重复,函数必须设计成幂等——同一个事件处理一次和处理十次,结果完全一样。比如处理订单时,不是盲目给用户加积分,而是先检查“这个订单号是否已经加过积分”,加过就直接返回成功。幂等性是 Serverless 事件的“防重复保险丝”。

另一个关键设计是重试。当函数执行失败时,平台会按配置自动重试。SQS 触发器默认启用重试,一条消息最多被接收多少次可在队列的 maxReceiveCount 中配置。超过最大接收次数,消息就会进入死信队列(DLQ)——一个专门存放“怎么也处理不好”的消息的隔离区。

这个诚实承诺,让开发者在设计系统时多了一根弦:宁可重复做,不可漏做。就像餐厅宁可多炒一份菜放着,也不敢让客人饿肚子。理解“至少一次”,也就理解了为什么幂等设计不是锦上添花,而是 Serverless 应用的生存底线。

Nattempts=1+RretriesN_{\text{attempts}} = 1 + R_{\text{retries}}
一条消息最多可能被函数处理的次数 = 首次尝试 1 次 + 配置的重试次数 R。
  1. 1(首次尝试)消息第一次被投递给函数,这是必须发生的。
    11
  2. R_retries(重试次数)配置允许的额外尝试次数,比如 3 次。
    RretriesR_{\text{retries}}
  3. 总尝试次数把首次和重试加起来,就是一条消息可能触发函数的最多次数。
    1+Rretries1 + R_{\text{retries}}

编排与容错

当“幸福小馆”同时运营堂食、外卖、团餐三条业务线时,单靠一个师傅就不够了——需要有人统筹调度、有人盯着异常、有人处理客诉。Serverless 里的多源编排,就是让多个事件源协同工作,共同完成一个复杂业务流。

一个典型的编排例子:用户下单后,API Gateway(在线点单)同步创建订单并返回成功;订单创建事件发给 EventBridge,由规则路由到两个目标——SQS 队列(通知物流服务异步处理)和另一个 Lambda(风控审查)。整个过程里,不同事件源各司其职,像一条流水线上的不同工序。

错误处理是编排的重中之重。每个环节都可能失败:函数超时、下游服务不可用、消息格式错误。应对策略包括:配置合理的重试次数、设置超时阈值、将多次重试仍失败的消息送入 DLQ,由专门的消费者函数定期分析排障。监控告警则让一切透明化——通过 CloudWatch 指标观察函数调用次数、错误率、并发数、队列深度,设置告警阈值,比如“队列积压超过 1000 条时触发告警”。

回到小馆,一个好的店长不会等到客人投诉了才发现问题,而是通过“后厨出菜速度”“外卖箱积压量”这些指标提前预判。编排与容错的意义,就是让系统在复杂多变的环境里,不仅能跑得快,更能跑得稳——出了问题能发现、能定位、能恢复。

A=MTBFMTBF+MTTRA = \frac{MTBF}{MTBF + MTTR}
系统可用性 = 平均无故障时间 ÷(平均无故障时间 + 平均恢复时间)。它衡量整个事件链路“能正常工作”的时间占比。
  1. MTBF(平均无故障时间)系统两次故障之间正常运行的平均时长,比如 99 小时。
    MTBFMTBF
  2. MTTR(平均恢复时间)从故障发生到恢复服务的平均耗时,比如 1 小时。
    MTTRMTTR
  3. 可用性比例正常运行时间占总时间的比例。99 小时正常 + 1 小时故障 = 99% 可用。
    MTBFMTBF+MTTR\frac{MTBF}{MTBF + MTTR}

AI 应用场景

电商订单全链路事件编排

阶段:数据接入与事件驱动处理

解决的问题:传统单体应用靠硬编码 if-else 串联订单、支付、物流、风控等多个环节,每加一个下游就要改一次核心代码,耦合严重且难以扩展。

具体案例:某电商平台重构订单系统——用户通过 API Gateway 请求下单函数,函数同步创建订单并返回“下单成功”;随后向 EventBridge 发出 order.created 事件;EventBridge 根据规则,把事件路由到风控函数(实时审查)和 SQS 队列(物流通知异步处理)。物流通知 Lambda 从 SQS 批量消费消息,系统整体处理能力提升约 3 倍,高峰期不再击穿数据库。

日志批量清洗管道

阶段:数据预处理与管道构建

解决的问题:应用日志量巨大且到达不均匀,若用同步方式逐条调用函数处理,会造成并发浪费和高峰期堆积,成本高且不稳定。

具体案例:某 SaaS 公司把全平台日志先写入 SQS 队列,SQS 触发器按每批 10 条将日志投递给 Lambda 函数,函数完成日志解析、格式标准化、写入数据仓库。如果消息处理失败,SQS 自动重试;超过 5 次仍失败的消息进入 DLQ,由值班日志分析脚本每天扫描 DLQ,并配合 CloudWatch 告警通知运维团队及时排查。

Python 演示

python74 行
"""模拟 Serverless 三类事件源触发:API Gateway 同步调用、SQS 批处理消费、EventBridge 规则匹配路由。"""import randomimport timeimport uuid  class LambdaFunction:    """模拟一个 Serverless 函数,记录处理结果,支持失败重试"""     def __init__(self, name: str) -> None:        self.name = name        self.success_count = 0        self.failure_count = 0     def invoke(self, event: dict) -> bool:        """执行一次调用,约 20% 概率失败,模拟不稳定下游"""        time.sleep(0.01)        if random.random() < 0.2:            self.failure_count += 1            return False        self.success_count += 1        return True     def report(self) -> dict:        """返回统计信息"""        return {            "name": self.name,            "success": self.success_count,            "failure": self.failure_count        }  def api_gateway_invoke(fn: LambdaFunction, payload: dict) -> str:    """API Gateway 同步调用:请求-响应直达结果"""    ok = fn.invoke({"source": "api", "payload": payload})    return "200 OK" if ok else "502 Bad Gateway"  def sqs_batch_invoke(fn: LambdaFunction, queue: list, batch_size: int = 3) -> list:    """SQS 批处理触发:从队列中取一批消息交给函数"""    results = []    batch = queue[:batch_size]    for msg in batch:        ok = fn.invoke({"source": "sqs", "body": msg})        results.append("success" if ok else "retry")    return results  def eventbridge_route(fn: LambdaFunction, event: dict) -> str:    """EventBridge 规则匹配:命中 detail-type 才触发函数"""    if event.get("detail-type") == "order.created":        fn.invoke({"source": "eventbridge", "detail-type": event["detail-type"]})        return "matched"    return "skipped"  if __name__ == "__main__":    fn = LambdaFunction("订单处理函数")     # 场景一:API Gateway 收到下单请求,同步返回结果    print(api_gateway_invoke(fn, {"action": "create_order"}))     # 场景二:SQS 队列有 5 条消息,按批处理一次取 3 条    queue = [{"order_id": str(uuid.uuid4())} for _ in range(5)]    print(sqs_batch_invoke(fn, queue, batch_size=3))     # 场景三:EventBridge 广播订单事件,仅匹配的触发    print(eventbridge_route(fn, {"detail-type": "order.created", "detail": {"amount": 88}}))     # 输出函数运行统计    print(fn.report())
目的:用 Python 模拟了 API Gateway 同步调用、SQS 批量消费、EventBridge 规则匹配三种事件源触发模式,并统计函数的成功与失败次数。
  1. class LambdaFunction:定义函数容器,统计成功/失败次数,模拟真实 FaaS 中函数被反复调用的场景。
  2. def invoke(self, event: dict) -> bool:模拟函数执行过程,用随机数制造 20% 的失败率,模拟不稳定下游。
  3. ok = fn.invoke({"source": "api", "payload": payload})API Gateway 同步调用,直接等待函数执行结果。
  4. batch = queue[:batch_size]SQS 触发器按批次取消息,而不是逐条调用,这是高吞吐的关键。
  5. if event.get("detail-type") == "order.created":EventBridge 通过规则字段匹配决定是否触发函数。
  6. print(fn.report())输出函数累计处理情况,便于验证不同事件源模式下函数的行为差异。

常见误区

误区“事件源触发不就是调用函数吗?调用完等结果就行了。”初学者常以为所有触发器都像 API 调用一样“一问一答”。

正解API Gateway 是同步等待结果,但 SQS 是异步批量拉取——消息先攒在队列里,函数有空才处理并返回“处理成功”,调用方并不等待。EventBridge 更是异步广播,发完事件就结束,谁响应、何时响应,都由规则和目标决定。选型时务必先问:这个业务需要立刻拿到答案吗?

为何常见:绝大多数入门教程用 API Gateway 做演示,容易让人形成“触发器 = 同步 HTTP 调用”的单一印象。

误区“队列嘛,消息进去了就安全了,每条只处理一次,像快递一样可靠送达。”

正解SQS 提供的是“至少一次”语义。正常情况下每条消息处理一次,但消费者超时、函数崩溃、网络抖动时,消息会被重新投递,出现重复处理。因此函数必须设计为幂等,比如用消息里的业务ID查重。把 SQS 当“恰好一次”用,迟早会出问题。

为何常见:人习惯了数据库事务“要么成功要么回滚”的直觉,很难立刻接受分布式队列“可能重复”的边界。

误区“EventBridge 也就是发个通知广播一下,和 SNS 差不多。”很多人在概念上把两者划等号。

正解EventBridge 的核心价值是“规则匹配 + 路由”——它根据事件的字段内容(金额、来源、类型)做精细过滤,只有命中的事件才发给对应目标。比如“金额大于 1000 的订单才通知风控函数”,SNS 需要额外写过滤代码,EventBridge 一行规则就能搞定。它的定位不是“通知”,而是“智能路由”。

为何常见:两者都做“事件发布”,表面相似,但没深入理解 EventBridge 的规则引擎能力,很容易误判。

误区“好消息!我配置了死信队列,失败的消息会自动处理掉。”

正解DLQ 只是“暂存区”,把多次重试仍失败的消息先存起来,防止无限重试。它不会自动消费、自动修复或自动重放。你需要额外的消费者函数读取 DLQ 中的消息,人工或自动分析失败原因,修复后重新处理。不维护 DLQ,它最终也会被坏消息塞满。

为何常见:“死信队列”这个名称让人误以为它“包办一切”,忽略了它只是一个被动存储。

误区“把 API、SQS、EventBridge 都接到同一个函数上,这样什么事件都能处理,多好!”

正解不同事件源给函数传的事件结构完全不同,混接会让函数代码充满“if 来自 API / else if 来自 SQS”的类型判断,逻辑混乱、难以调试和维护。合理做法是:一个函数只服务一个职责、接收一种明确的事件源,需要多源编排时用 EventBridge 或 Step Functions 做分层转发,而不是把函数变成“大杂烩”。

为何常见:这是“少写几个函数”的偷懒心态,忽略了清晰架构带来的长期可维护性。

面试题

Q1. API Gateway 触发 Lambda 时,函数的调用模式通常属于哪种?

单选题 · easy

  • A.异步消息队列模式
  • B.同步请求响应模式← 正确答案
  • C.批处理拉取模式
  • D.定时器轮询模式

答案:B。API Gateway 接收 HTTP 请求后同步调用 Lambda,客户端必须等待函数执行完毕并拿到返回值,属于典型的同步请求-响应模式。SQS 才对应批处理和异步模式。

Q2. SQS 队列相比 API Gateway 最核心的差异是什么?

单选题 · easy

  • A.是否支持数据加密存储
  • B.能否跨地域部署服务
  • C.有消息缓冲和解耦机制← 正确答案
  • D.是否支持 Python 语言

答案:C。SQS 引入队列作为中间缓冲层,生产者和消费者互不阻塞,流量洪峰时消息先积压再被消费;而 API Gateway 是直接请求-响应,没有缓冲,因此更怕突发流量。

Q3. 死信队列(DLQ)的主要用途是什么?

单选题 · easy

  • A.提升函数执行运算速度
  • B.暂存多次重试失败事件← 正确答案
  • C.增加函数的并发实例数
  • D.降低函数冷启动延迟

答案:B。DLQ 是“失败的隔离区”,当事件重试超过最大次数仍失败,就被送入 DLQ 暂存。它不是计算加速器,也不是并发管理器,而是等待人工分析和事后处理的兜底存储。

Q4. 事件被定义为“状态变化 + 数据载荷”,以下哪个最符合事件的特征?

单选题 · mid

  • A.一台虚拟服务器的规格清单
  • B.订单状态从“待支付”变为“已支付”← 正确答案
  • C.数据库建表语句的备份文档
  • D.一个函数源码的版本号

答案:B。事件必须包含“发生了什么变化”以及“相关的数据”,例如“订单状态变为已支付”这个变化,连同订单号、金额等数据,才构成一个完整事件。规格清单、备份文档只是静态信息,没有状态变化语义。

Q5. 某个 API 业务 QPS=200,函数平均耗时 250ms,所需最少并发约为多少?

单选题 · mid

  • A.80 个实例左右
  • B.800 个实例以上
  • C.50 个实例左右← 正确答案
  • D.25 个实例以内

答案:C。按公式 C = QPS × T ÷ 1000 = 200 × 250 ÷ 1000 = 50,至少需要约 50 个并发实例才能跟上流量。若取整或留余量可设 60-80,但数学上 50 是下限。

Q6. EventBridge 完成一次事件路由,通常需要哪些核心组件参与?

多选题 · mid

  • A.事件总线接收事件← 正确答案
  • B.规则对事件字段匹配← 正确答案
  • C.目标绑定接收事件方← 正确答案
  • D.网络负载均衡分压

答案:ABC。事件先进入总线,再被规则按字段筛选匹配,命中的事件被路由到绑定的目标。网络负载均衡属于传统网络层组件,并非 EventBridge 的组成部分。

Q7. 在“至少一次”语义下,为保证函数能安全处理重复消息,应该怎么做?

多选题 · mid

  • A.用业务唯一键查重去重← 正确答案
  • B.直接忽略所有重复事件
  • C.把唯一键存入数据库再判断← 正确答案
  • D.每次处理前随机生成新 ID

答案:AC。幂等处理的关键是“先查重、后处理”,用订单号等唯一业务键在数据库查重,能确保重复事件不会产生副作用。直接忽略不可靠,随机生成新 ID 反而破坏去重能力。

Q8. EventBridge 规则匹配中,事件的哪个字段组合决定事件是否被路由?

单选题 · hard

  • A.所有已指定字段同时满足← 正确答案
  • B.只要求来源字段匹配
  • C.任意字段有一个匹配即可
  • D.只需要 detail 子字段匹配

答案:A。EventBridge 规则可以包含 source、detail-type、detail 等多个条件,事件必须满足规则中所有已声明的条件才会被路由,是“与”的关系。这也是 EventBridge 能做精细路由的原因。

Q9. SQS 队列积压突然暴增,合理的排查与应对措施有哪些?

多选题 · hard

  • A.检查函数错误率和超时配置← 正确答案
  • B.调整批处理大小和处理窗口← 正确答案
  • C.检查 DLQ 中是否有大量失败消息← 正确答案
  • D.把队列消息全部清空重来

答案:ABC。积压暴增通常意味着消费速度跟不上生产速度——先查函数是否大面积报错、批处理参数是否合理、失败消息是否大量进入 DLQ。直接清空队列会丢失数据,是错误操作。

Q10. 下列哪种场景最适合选用 SQS 异步触发而不是 API Gateway?

单选题 · hard

  • A.用户登录页需要立即返回令牌
  • B.订单创建后批量发送通知短信← 正确答案
  • C.前端实时查询商品库存
  • D.支付回调需同步确认签名

答案:B。批量发送通知短信不需要用户“立刻等到结果”,且可能面临高峰期大流量。用 SQS 缓冲可以让函数按批次消化,削峰填谷。其余选项都需要同步实时响应,更适合 API Gateway。