Elixir开发中的关键策略:背压处理、API扩展与生命周期管理
1. 优先使用Call而非Cast以实现背压控制
在消息传递时,直觉上我们可能会认为使用单向的 handle_cast 来发送不需要响应的消息是最佳选择。例如, :add_template 消息实际上不需要响应,我们只是默认模板已成功添加。若未成功添加,那意味着出现了严重问题,我们可能只能让服务器崩溃并向用户报告崩溃原因。
然而, handle_cast 很少是发送消息的最佳选项,这涉及到可序列化性和背压的问题。每个Elixir进程都有一个消息队列(我们称之为邮箱),若接收消息的进程处理困难,邮箱可能会溢出,导致难以调试的严重问题。
以Elixir日志记录器为例,若生产代码发送日志消息的速度超过日志记录器的处理能力,无论是因为发送方记录的日志请求过多,还是日志记录器的磁盘I/O出现问题,我们都不希望日志记录器立即停止记录消息。日志记录器采用了选择性背压机制,当它遇到问题时,会检测到该问题并通过从 cast 切换到 call 来减缓客户端的速度。
1.1 配置与阈值
用户可以配置阈值选项,这些阈值指定了健康的日志记录器何时会因消息队列过长而出现问题。其中两个阈值分别指定何时从 cast 切换到 call ,以及何时开始丢弃消息。用户还可以配置阈值来定义系统何时从异常状态恢复到正常状态。当异常系统的消息队列长度低于这些阈值时,日志记录器可以停止丢弃消息,或者从
超级会员免费看
订阅专栏 解锁全文
863

被折叠的 条评论
为什么被折叠?



