Overview
在本指南中,您可以学习;了解如何使用 timeout_ms 选项为服务器操作设立超时。
使用Ruby驾驶员执行服务器操作时,可以限制服务器完成操作所允许的持续时间。为此,请指定客户端操作超时 (CSOT)。超时适用于完成操作所需的所有步骤,包括服务器选择、连接签出和服务器端执行。如果在操作完成之前超时, Ruby驾驶员会引发超时异常。
timeout_ms 选项
要在连接到MongoDB 部署时指定超时,请将 timeout_ms 连接选项设立为超时长度(以毫秒为单位)。您可以通过以下方式指定超时值:
将
timeout_ms客户端选项传递给Mongo::Client构造函数。将
timeoutMS连接字符串选项作为参数传递给您的连接字符串。
从以下标签页中进行选择,查看如何使用 timeout_ms客户端选项或 timeoutMS连接字符串选项来指定 30 秒超时的示例:
uri = "<connection string>" options = { timeout_ms: 30000 } client = Mongo::Client.new(uri, options)
uri = "mongodb://<hostname>:<port>?timeoutMS=30000" client = Mongo::Client.new(uri)
如果指定 timeout_ms 选项,驾驶员会自动为每个服务器操作应用指定的超时时间。
注意
timeout_ms 连接选项统一了大多数超时相关选项。以下超时选项已弃用:
socket_timeoutwait_queue_timeoutwtimeoutmax_time_msmax_commit_time_ms
timeout_ms 连接选项优先于这些已弃用的超时选项。
超时继承
当您指定 timeout_ms 选项时,驾驶员将根据与其他Ruby驾驶员选项相同的继承行为应用超时。下表描述了如何在每个级别继承超时值:
等级 | 继承说明 |
|---|---|
操作 | 具有最高优先级并覆盖在任何其他级别设立的 |
事务 | 优先于在会话、集合、数据库或客户端级别设立的 |
会话 | 适用于该会话中的所有事务和操作,除非该选项被在这些级别设立的选项覆盖。 |
Database | 适用于该数据库中的所有会话和操作,除非该选项被在这些级别设立的选项覆盖。 |
Collection | 适用于该集合上的所有会话和操作,除非该选项被在这些级别设立的选项覆盖。 |
客户 | 适用于该客户端内未指定 |
要学习;了解有关覆盖超时选项和设置其他选项的更多信息,请参阅以下 覆盖 部分。
覆盖
您可以在操作级别指定 timeout_ms 选项,以覆盖特定操作的客户端级别配置。 这允许您根据各个查询的需求自定义超时。
以下示例演示了操作级 timeout_ms 配置如何覆盖客户端级 timeout_ms 配置:
require 'mongo' # Replace the placeholder with your connection string uri = "<connection string>" # Sets a client-level timeout configuration options = { timeout_ms: 30000 } Mongo::Client.new(uri, options) do |client| db = client.use('test-db') collection = db[:test-collection] # Performs a query with an operation-level timeout configuration, # overriding the client-level configuration docs = collection.find({}, timeout_ms: 10000).to_a docs.each { |doc| puts doc } end
事务
您可以使用 default_timeout_ms客户端选项设立事务超时。
当您创建新的 Mongo::Session实例来实现ACID 事务时,可以设立default_timeout_ms客户端选项,为以下方法指定 timeout_ms 值:
如果不指定 default_timeout_ms,驾驶员将使用在父项 Mongo::Client 上设立的timeout_ms 值。
对于 start_session 调用,您无法覆盖 Mongo::Client 的 timeout_ms 值。
您只能使用 timeout_ms 选项为 start_transaction 方法设立超时值。
您无法通过在 with_transaction回调提供的ACID 事务会话中的操作上设置 timeout_ms 选项来覆盖 default_timeout_ms,否则驾驶员会引发错误。
客户端加密
使用客户端字段级加密(CSFLE) 时,驾驶员使用 timeout_ms 选项来限制加密和解密操作所允许的时间。
如果在构造 ClientEncryption实例时指定 timeout_ms 选项,它将控制对该实例执行的所有操作的生命周期。 如果您不提供 timeout_ms,则实例将从 ClientEncryption 构造函数中使用的 Mongo::Client 继承 timeout_ms 设置。
如果您在客户端上和直接在 ClientEncryption 中同时设立timeout_ms,则提供给 ClientEncryption 的值优先。
Cursors
使用 CSOT功能时,游标提供可配置的超时设置。 如果需要,可以通过配置游标生存期或游标迭代模式来调整游标处理。 要配置模式,设立为timeoutMode cursorLifetime(即默认)或iteration 。
游标生命周期模式
游标生命周期模式使用 timeout_ms 来限制游标的整个生命周期。 在此模式下,游标的初始化以及对游标方法的所有后续调用必须在 timeout_ms 选项指定的限制内完成。 所有文档必须在此限制内退回。 否则,游标的生命周期将到期并出现超时错误。
当您通过调用 to_a 或 close 方法关闭游标时,超时将重置,以确保清理服务器端资源。
以下示例展示了如何设立timeout_ms 选项,以确保游标初始化并在 10 秒内检索所有文档:
docs = collection.find({}, timeout_ms:10000).to_a
游标迭代模式
游标迭代模式使用 timeout_ms 选项来限制对 try_next 方法的每次调用。每次调用完成后,超时时间都会刷新。这是所有可追加游标的默认模式,例如 find 方法在固定大小集合或变更流上返回的可追加游标。
以下代码示例使用可迭代游标遍历示例集合中的文档,然后获取并记录每个电影文档的 title 信息:
cursor = collection.find() cursor.each do |movie| puts movie['title'] end
API 文档
要学习;了解有关在Ruby驾驶员中使用超时的更多信息,请参阅以下API文档: