模块:Mongo::Retryable
- 扩展方式:
- 可转发
- 包含在:
- Cluster::CursorReaper 、 Collection 、 Collection::View::Aggregation::Behavior 、 Collection::View::ChangeStream 、 Collection::View::MapReduce 、 Cursor 、 Database 、 Database::View 、 Index::View 、 SearchIndex: :View 、 Server::Connection 、 Session
- 定义于:
- lib/ Mongo/retryable.rb,
lib/ Mongo/retryable/base_worker.rb,
lib/ Mongo/retryable/read_worker.rb,
lib/ Mongo/retryable/back压.rb,
lib/ Mongo/retryable/retry_policy.rb,
lib/ Mongo/retryable/write_worker.rb
Overview
定义有关重试操作的基本行为。
在命名空间下定义
模块: 背压 类: BaseWorker、ReadWorker、RetryPolicy、WriteWorker
实例方法摘要折叠
-
# read_worker ⇒ 对象
private
返回用于处理可重试读取的读取工作线程。
-
# select_server (集群, server_selector, session, failed_server = nil, error: nil, timeout: nil) ⇒ Mongo::Server
private
这是一种单独的方法,使测试套件可以断言在重试尝试期间已执行服务器选择。
-
# with_overload_retry (context: nil, retry_enabled: true) ⇒ 对象
private
使用重载重试逻辑包装操作。
-
# write_worker ⇒ 对象
private
返回用于处理可重试写入的写入工作线程。
实例方法详细信息
# read_worker ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
注意:
这只是一个公共方法,因此测试可以基于它添加期望。
返回用于处理可重试读取的读取工作线程。
86 87 88 |
# File 'lib/ Mongo/retryable.rb', line 86 def read_worker @read_worker ||= ReadWorker.new(self) end |
#select_server(集群, server_selector, session, failed_server = nil, error: nil, timeout: nil) ⇒ Mongo::服务器
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
这是一种单独的方法,使测试套件可以断言在重试尝试期间已执行服务器选择。
这是一个公共方法,因此可以根据需要通过读取和写入工作线程委托进行访问。
49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/ Mongo/retryable.rb', line 49 def select_server(集群, server_selector, 会话, failed_server = nil, 错误: nil, timeout: nil) deprioritized = if failed_server && deprioritize_server?(集群, 错误) [ failed_server ] else [] end server_selector.select_server( 集群, nil, 会话, 取消优先级: deprioritized, timeout: 超时 ) end |
#with_overload_retry (context: nil, retry_enabled: true) ⇒ 对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
使用重载重试逻辑包装操作。出现过载错误 (SystemOverloadedError + RetryableError),使用指数退避重试区块,最多 MAX_RETRIES 次。
该区块应包括服务器选择,以便在重试时重新完成。对于游标操作 (getMore),由于游标已固定,因此会重复使用同一服务器。
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/ Mongo/retryable.rb', line 117 def with_overload_retry(上下文: nil, retry_enabled: true) return 产量 除非 retry_enabled error_count = 0 循环 do 结果 = 产量 return 结果 救援 错误::超时错误 提高 救援 错误::OperationFailure::家庭情况 => e 提高 e 除非 e.标签?('SystemOverloadedError') && e.标签?('RetryableError') error_count += 1 policy = 客户端.retry_policy 延迟 = policy.backoff_delay(error_count) 提高 e 除非 policy.should_retry_overload?(error_count, 延迟, 上下文: 上下文) 记录器.记录器.WARN("过载重试由于以下原因:#{e.类.name}: #{e.}") 睡眠(延迟) end end |
# write_worker ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
注意:
这只是一个公共方法,因此测试可以基于它添加期望。
返回用于处理可重试写入的写入工作线程。
96 97 98 |
# File 'lib/ Mongo/retryable.rb', line 96 def write_worker @write_worker ||= WriteWorker.new(self) end |