Nhóm kết nối Mongodb đã đóng

Trình điều khiển hiện hỗ trợ nhiều tùy chọn cho phép người dùng định cấu hình hành vi tổng hợp kết nối. Người dùng bối rối bởi các trình điều khiển hỗ trợ các tập hợp con khác nhau của các tùy chọn này. Ngoài ra, các trình điều khiển triển khai nhóm kết nối của chúng khác nhau, gây khó khăn cho việc thiết kế chức năng nhóm trình điều khiển chéo. Bằng cách thống nhất và mã hóa các tùy chọn và hành vi tổng hợp trên tất cả các trình điều khiển, chúng tôi sẽ tăng khả năng hiểu của người dùng và khả năng bảo trì cơ sở mã

Các từ khóa “PHẢI”, “KHÔNG PHẢI”, “BẮT BUỘC”, “SẼ”, “SẼ KHÔNG”, “NÊN”, “KHÔNG NÊN”, “KHUYẾN NGHỊ”, “CÓ THỂ” và “TÙY CHỌN” trong tài liệu này là để

Một kết nối (khi được liên kết) đề cập đến loại

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
7 được xác định trong phần của thông số kỹ thuật này. Nó không đề cập đến kết nối TCP thực tế với Điểm cuối. Một
interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
7 sẽ cố gắng tạo và bọc một kết nối TCP như vậy trong suốt quá trình tồn tại của nó, nhưng nó không tương đương với một và cũng không phải lúc nào cũng bọc một kết nối đang hoạt động

Với mục đích thử nghiệm, loại

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
7 giả định có thể được sử dụng với nhóm không bao giờ thực sự tạo kết nối TCP hoặc thực hiện bất kỳ I/O nào

Để thuận tiện, một Điểm cuối đề cập đến một thể hiện mongod hoặc mongos

Để thuận tiện, một Chủ đề đề cập đến

  • Một quá trình chia sẻ không gian địa chỉ (a. k. a. một luồng) trong trình điều khiển đa luồng
  • Khung thực thi/Tiếp tục trong trình điều khiển không đồng bộ
  • Một goroutine trong Go

Thông số kỹ thuật này chỉ liên quan đến các trình điều khiển triển khai nhóm kết nối. Trình điều khiển NÊN triển khai nhóm kết nối, nhưng không bắt buộc phải

Tất cả các trình điều khiển triển khai nhóm kết nối PHẢI triển khai và tuân thủ các tùy chọn MongoClient giống nhau. Có thể có một chút sai lệch trong cách đặt tên để làm cho các tùy chọn phù hợp với ngôn ngữ trình điều khiển

Tất cả các nhóm kết nối trình điều khiển PHẢI cung cấp API cho phép trình điều khiển kiểm tra kết nối, kiểm tra kết nối trở lại nhóm và xóa tất cả các kết nối trong nhóm. API này chỉ dành cho sử dụng nội bộ và KHÔNG NÊN được ghi lại dưới dạng API công khai

Tất cả các trình điều khiển triển khai nhóm kết nối PHẢI cung cấp API cho phép người dùng đăng ký các sự kiện được phát ra từ nhóm

Trình điều khiển triển khai Nhóm kết nối PHẢI hỗ trợ ConnectionPoolOptions sau

interface ConnectionPoolOptions {
  /**
   *  The maximum number of Connections that may be associated
   *  with a pool at a given time. This includes in use and
   *  available connections.
   *  If specified, MUST be an integer >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 100.
   */
  maxPoolSize?: number;

  /**
   *  The minimum number of Connections that MUST exist at any moment
   *  in a single connection pool.
   *  If specified, MUST be an integer >= 0. If maxPoolSize is > 0
   *  then minPoolSize must be <= maxPoolSize
   *  Defaults to 0.
   */
  minPoolSize?: number;

  /**
   *  The maximum amount of time a Connection should remain idle
   *  in the connection pool before being marked idle.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  maxIdleTimeMS?: number;

  /**
   *  The maximum number of Connections a Pool may be establishing concurrently.
   *  Establishment of a Connection is a part of its life cycle
   *  starting after a ConnectionCreatedEvent and ending before a ConnectionReadyEvent.
   *  If specified, MUST be a number > 0.
   *  Defaults to 2.
   */
  maxConnecting?: number;
}

Ngoài ra, Trình điều khiển triển khai Nhóm kết nối PHẢI hỗ trợ ConnectionPoolOptions sau TRỪ KHI trình điều khiển đó đáp ứng TẤT CẢ các điều kiện sau

  • Trình điều khiển/ngôn ngữ hiện có cơ chế hết thời gian chờ thành ngữ được triển khai
  • Cơ chế thời gian chờ phù hợp với

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}

Các tùy chọn này PHẢI được chỉ định ở cấp độ MongoClient và NÊN được đặt tên theo cách đặc trưng cho ngôn ngữ của trình điều khiển. Tất cả các nhóm kết nối được tạo bởi MongoClient PHẢI sử dụng cùng một ConnectionPoolOptions

Khi phân tích chuỗi kết nối mongodb, người dùng PHẢI có thể chỉ định các tùy chọn này bằng tên mặc định được chỉ định ở trên

Các ConnectionPoolOptions sau được coi là không dùng nữa. Chúng KHÔNG PHẢI được triển khai nếu chúng chưa tồn tại trong trình điều khiển và chúng KHÔNG ĐƯỢC dùng nữa và bị xóa khỏi trình điều khiển triển khai chúng càng sớm càng tốt

interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}

Trình bao bọc do trình điều khiển xác định xung quanh một kết nối TCP đến Điểm cuối. A có các tính chất sau

  • Điểm cuối duy nhất. PHẢI được liên kết với một Điểm cuối duy nhất. KHÔNG ĐƯỢC liên kết với nhiều Điểm cuối
  • Trọn đời độc thân. A PHẢI KHÔNG được sử dụng sau khi đóng cửa
  • Chủ sở hữu duy nhất. PHẢI thuộc về chính xác một Nhóm và KHÔNG ĐƯỢC chia sẻ trên nhiều nhóm
  • Đường đơn. PHẢI tự giới hạn ở một yêu cầu/phản hồi tại một thời điểm. KHÔNG PHẢI yêu cầu ghép kênh/đường ống tới Điểm cuối
  • Tăng ID đơn điệu. PHẢI có một số ID được liên kết với nó. ID trong Nhóm PHẢI được chỉ định theo thứ tự tạo, bắt đầu từ 1 và tăng thêm 1 cho mỗi Kết nối mới
  • Kết nối hợp lệ. Một kết nối KHÔNG ĐƯỢC kiểm tra ra khỏi nhóm cho đến khi nó đã hoàn tất thành công và đầy đủ một Bắt tay và Xác thực MongoDB như được chỉ định trong các thông số kỹ thuật Bắt tay, OP_COMPRESSED và Xác thực
  • dễ hỏng. nó có thể trở thành hư vô. A được coi là đã chết nếu bất kỳ điều nào sau đây là đúng
    • Cũ. Thế hệ 's không khớp với thế hệ của nhóm mẹ
    • nhàn rỗi. Hiện tại "có sẵn" (như được định nghĩa bên dưới) và đã tồn tại lâu hơn maxIdleTimeMS
    • bị lỗi. Đã gặp lỗi cho biết nó không còn được khuyến nghị sử dụng nữa. Các ví dụ bao gồm, nhưng không giới hạn ở
      • Lỗi mạng
      • hết giờ kết nối
      • Điểm cuối đóng kết nối
      • Thời gian chờ phía người lái xe
      • Lỗi giao thức dây

interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}

Một khái niệm đại diện cho các yêu cầu đang chờ xử lý cho. Khi một luồng yêu cầu từ một Nhóm, luồng đó sẽ vào WaitQueue của Nhóm. Một luồng ở trong WaitQueue cho đến khi nó nhận được a hoặc hết thời gian chờ. Một WaitQueue có các đặc điểm sau

  • Chủ đề an toàn. Khi nhiều luồng cố gắng vào hoặc thoát khỏi WaitQueue, chúng sẽ làm như vậy theo cách an toàn cho luồng
  • Đặt hàng / Khá. Khi được cung cấp, chúng được cấp cho các luồng theo thứ tự mà các luồng đã nhập vào WaitQueue
  • Hết giờ tích cực. Các thành viên của WaitQueue PHẢI hết thời gian chờ nếu họ được xếp hàng lâu hơn thời gian chờ được tính toán và PHẢI rời khỏi WaitQueue ngay lập tức trong trường hợp này

Các chi tiết triển khai của WaitQueue được để lại cho trình điều khiển. Ví dụ triển khai bao gồm

  • Một Semaphore công bằng
  • Một hàng đợi gọi lại

Một thực thể do trình điều khiển xác định gói gọn tất cả hoạt động không giám sát được liên kết với một Điểm cuối duy nhất. Hồ bơi có các thuộc tính sau

  • chủ đề an toàn. Tất cả các hành vi Nhóm PHẢI là luồng an toàn
  • Không an toàn với ngã ba. Một Pool rõ ràng là không an toàn cho fork. Nếu một Nhóm phát hiện ra rằng nó đang được sử dụng bởi một quy trình rẽ nhánh, thì nó PHẢI tự xóa ngay lập tức và cập nhật pid của mình.
  • Chủ sở hữu duy nhất. Nhóm PHẢI được liên kết với chính xác một Điểm cuối và KHÔNG ĐƯỢC chia sẻ giữa các Điểm cuối
  • Phát ra sự kiện và thông điệp bản ghi. Một nhóm PHẢI phát ra các sự kiện nhóm và thông báo nhật ký khi được quy định bởi thông số kỹ thuật này (xem phần ). Người dùng PHẢI có khả năng đăng ký các sự kiện được phát ra và ghi lại các thông điệp theo cách phù hợp với ngôn ngữ và trình điều khiển của họ
  • có thể đóng. Một nhóm PHẢI có thể được đóng thủ công. Khi một Pool bị đóng, các hành vi sau đây sẽ thay đổi
    • Đăng ký vào Pool sẽ tự động đóng
    • Cố gắng kiểm tra một từ Nhóm dẫn đến Lỗi
  • Có thể xóa. Một Pool PHẢI có thể được xóa. Xóa nhóm đánh dấu tất cả được gộp chung và kiểm xuất là cũ và đóng chúng một cách uể oải khi chúng được kiểm nhập hoặc gặp phải trong kiểm xuất. Ngoài ra, tất cả các yêu cầu đều bị loại khỏi WaitQueue và trả về các lỗi được coi là lỗi mạng không hết thời gian chờ
  • Có thể tạm dừng. Một Nhóm PHẢI có thể tạm dừng và tiếp tục. Một Pool tự động bị tạm dừng khi nó bị xóa và nó có thể được tiếp tục lại bằng cách được đánh dấu là "sẵn sàng". Trong khi Pool bị tạm dừng, nó thể hiện các hành vi sau
    • Cố gắng kiểm tra từ Nhóm dẫn đến lỗi mạng không hết thời gian chờ
    • Các kết nối không được tạo trong nền để đáp ứng minPoolSize
  • giới hạn. một nhóm bị giới hạn nếu maxPoolSize được đặt thành giá trị khác không. Nếu một nhóm bị giới hạn, thì tổng số nhóm (bao gồm cả khả dụng và đang sử dụng) KHÔNG ĐƯỢC vượt quá maxPoolSize
  • Tỷ lệ giới hạn. Một Pool PHẢI giới hạn số lượng đồng thời thông qua maxConnecting

interface ConnectionPool {
  /**
   *  The Queue of threads waiting for a Connection to be available
   */
  waitQueue: WaitQueue;

  /**
   *  A generation number representing the SDAM generation of the pool.
   */
  generation: number;

  /**
   * A map representing the various generation numbers for various services
   * when in load balancer mode.
   */
  serviceGenerations: Map<ObjectId, [number, number]>;

  /**
   * The state of the pool.
   *
   * Possible values are the following:
   *   - "paused":        The initial state of the pool. Connections may not be checked out nor can they
   *                      be established in the background to satisfy minPoolSize. Clearing a pool
   *                      transitions it to this state.
   *
   *   - "ready":         The healthy state of the pool. It can service checkOut requests and create
   *                      connections in the background. The pool can be set to this state via the
   *                      ready() method.
   *
   *   - "closed":        The pool is destroyed. No more Connections may ever be checked out nor any
   *                      created in the background. The pool can be set to this sate via the close()
   *                      method. The pool cannot transition to any other state after being closed.
   */
  state: "paused" | "ready" | "closed";

  // Any of the following connection counts may be computed rather than
  // actually stored on the pool.

  /**
   *  An integer expressing how many total Connections
   *  ("pending" + "available" + "in use") the pool currently has
   */
  totalConnectionCount: number;

  /**
   *  An integer expressing how many Connections are currently
   *  available in the pool.
   */
  availableConnectionCount: number;

  /**
   *  An integer expressing how many Connections are currently
   *  being established.
   */
  pendingConnectionCount: number;

  /**
   *  Returns a Connection for use
   */
  checkOut(): Connection;

  /**
   *  Check in a Connection back to the Connection pool
   */
  checkIn(connection: Connection): void;

  /**
   *  Mark all current Connections as stale, clear the WaitQueue, and mark the pool as "paused".
   *  No connections may be checked out or created in this pool until ready() is called again.
   *  interruptInUseConnections specifies whether the pool will force interrupt "in use" connections as part of the clear.
   *  Default false.
   */
  clear(interruptInUseConnections: Optional<Boolean>): void;

  /**
   *  Mark the pool as "ready", allowing checkOuts to resume and connections to be created in the background.
   *  A pool can only transition from "paused" to "ready". A "closed" pool
   *  cannot be marked as "ready" via this method.
   */
  ready(): void;

  /**
   *  Marks the pool as "closed", preventing the pool from creating and returning new Connections
   */
  close(): void;
}

Thông số kỹ thuật này không xác định cách tạo nhóm, tùy thuộc vào trình điều khiển. Việc tạo nhóm kết nối nói chung là một chi tiết triển khai của trình điều khiển, tôi. e. , không phải là một phần của API công khai của trình điều khiển. Đặc tả SDAM xác định trình điều khiển sẽ tạo nhóm kết nối

Khi một nhóm được tạo, trạng thái của nó ban đầu PHẢI được đặt thành "tạm dừng". Ngay cả khi minPoolSize được đặt, nhóm KHÔNG ĐƯỢC bắt đầu cho đến khi nó được đánh dấu là "sẵn sàng". SDAM sẽ đánh dấu nhóm là "sẵn sàng" trên mỗi lần kiểm tra thành công. Xem phần trong đặc tả SDAM để biết thêm thông tin

________số 8

Khi một nhóm bị đóng, trước tiên nó PHẢI đóng tất cả có sẵn trong nhóm đó. Điều này dẫn đến những thay đổi hành vi sau đây

  • Đang sử dụng PHẢI được đóng lại khi chúng được đăng ký vào nhóm đã đóng
  • Cố gắng kiểm tra kết quả PHẢI dẫn đến lỗi
mark pool as "closed"
for connection in availableConnections:
  close connection
emit PoolClosedEvent and equivalent log message

Nhóm kết nối bắt đầu là "tạm dừng" và chúng được người giám sát đánh dấu là "sẵn sàng" sau khi chúng thực hiện kiểm tra máy chủ thành công. Khi một nhóm đã "sẵn sàng", nó có thể bắt đầu kiểm tra và đưa chúng vào nền

Nếu nhóm đã "sẵn sàng" khi phương thức này được gọi, thì phương thức này PHẢI trả về ngay lập tức và KHÔNG ĐƯỢC phát ra PoolReadyEvent

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
0

Lưu ý rằng PoolReadyEvent PHẢI được phát ra trước khi luồng nền được phép tiếp tục tạo kết nối mới và không có người quan sát nào có thể quan sát hành động của luồng nền liên quan đến việc tạo kết nối mới trước khi quan sát sự kiện PoolReadyEvent

Khi tạo một , lần đầu tiên ở trạng thái "đang chờ xử lý". Điều này chỉ tạo ra một "ảo" và không thực hiện I/O

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
1

Trước khi có thể đánh dấu là "có sẵn" hoặc "đang sử dụng", nó phải được thiết lập. Quá trình này bao gồm thực hiện bắt tay ban đầu, xử lý OP_COMPRESSED và thực hiện xác thực

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
2

Khi a đóng, trước tiên nó PHẢI được đánh dấu là "đã đóng", loại bỏ nó để không được tính là "có sẵn" hoặc "đang sử dụng". Sau khi hoàn thành, có thể thực hiện bất kỳ thao tác xé nhỏ nào cần thiết để đóng ổ cắm bên dưới của nó. Trình điều khiển NÊN thực hiện phân tách này theo cách không chặn, chẳng hạn như thông qua việc sử dụng luồng nền hoặc I/O không đồng bộ

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
0

A là "có sẵn" nếu nó có thể được kiểm xuất. KHÔNG PHẢI được đánh dấu là "có sẵn" cho đến khi nó được thiết lập. Nhóm PHẢI theo dõi số lượng hiện có

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
1

"Điền vào" nhóm liên quan đến việc tạo trước và thiết lập một nhóm được đánh dấu là "có sẵn" để sử dụng trong các hoạt động trong tương lai

Dân số nhóm KHÔNG ĐƯỢC chặn bất kỳ luồng ứng dụng nào. Ví dụ: nó có thể được thực hiện trên một luồng nền hoặc thông qua việc sử dụng I/O không chặn/không đồng bộ. Việc tạo nhóm KHÔNG ĐƯỢC thực hiện trừ khi nhóm "sẵn sàng"

Nếu gặp lỗi trong khi tạo kết nối, nó PHẢI được xử lý thông qua máy SDAM theo phần trong thông số kỹ thuật SDAM

Nếu minPoolSize được đặt, Pool PHẢI được điền cho đến khi nó có ít nhất tổng số minPoolSize. Điều này PHẢI xảy ra chỉ khi nhóm "sẵn sàng". Nếu nhóm thực hiện một luồng nền, nó có thể được sử dụng cho việc này. Nếu nhóm không triển khai luồng nền, phương thức checkOut chịu trách nhiệm đảm bảo đáp ứng yêu cầu này

Khi điền vào Nhóm, số lượng kết nối đang chờ xử lý phải được giảm xuống sau khi thiết lập tương tự như cách nó được thực hiện để báo hiệu rằng một cái khác được phép thiết lập. Một tín hiệu như vậy PHẢI trở nên có thể quan sát được đối với bất kỳ hành động nào sau khi hành động đó trở nên có thể quan sát được đối với. Một cách không chính thức, thứ tự này đảm bảo rằng không cố gắng bắt đầu thiết lập một khi có một "có sẵn" được thiết lập do việc điền vào Nhóm

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
2

Một Nhóm PHẢI có một phương pháp cho phép người lái xe kiểm tra một. Kiểm tra một liên quan đến việc gửi yêu cầu tới WaitQueue và khi yêu cầu đó đến đầu hàng đợi, yêu cầu Nhóm tìm hoặc tạo một yêu cầu để thực hiện yêu cầu đó. Các yêu cầu PHẢI tuân theo thời gian chờ được tính theo các quy tắc trong

Để phục vụ một yêu cầu cho một , trước tiên Pool PHẢI lặp lại danh sách có sẵn, tìm kiếm một cái không bị hỏng để được trả lại. Nếu gặp phải một biến cố định, thì biến đó PHẢI được đóng lại (như được mô tả trong ) và quá trình lặp lại biến có sẵn PHẢI tiếp tục cho đến khi tìm thấy biến có sẵn không bị hỏng hoặc danh sách có sẵn đã cạn kiệt

Nếu danh sách đã hết, tổng số nhỏ hơn maxPoolSize và nhóm đang chờ kết nối < maxConnecting, thì nhóm PHẢI tạo, thiết lập, đánh dấu là "đang sử dụng" và trả lại. Nếu totalConnectionCount == maxPoolSize hoặc PendingConnectionCount == maxConnecting, thì nhóm PHẢI đợi để phục vụ yêu cầu cho đến khi cả hai điều kiện đó đều không được đáp ứng hoặc cho đến khi có sẵn, nhập lại vòng lặp kiểm tra trong cả hai trường hợp. Việc chờ đợi này KHÔNG ĐƯỢC ngăn cản việc được đăng ký vào nhóm. Ngoài ra, Nhóm KHÔNG ĐƯỢC phục vụ bất kỳ yêu cầu thanh toán nào mới hơn trước khi thực hiện yêu cầu ban đầu không thể thực hiện được. Đối với các trình điều khiển triển khai WaitQueue thông qua một semaphore công bằng, một biến điều kiện cũng có thể cần thiết để đáp ứng yêu cầu này. Việc chờ biến điều kiện cũng NÊN bị giới hạn bởi WaitQueueTimeout, nếu trình điều khiển hỗ trợ một biến và nó được chỉ định bởi người dùng

Nếu nhóm bị "đóng" hoặc "tạm dừng", bất kỳ nỗ lực nào để kiểm tra PHẢI đưa ra Lỗi. Lỗi được đưa ra do nhóm bị "tạm dừng" PHẢI được coi là lỗi có thể thử lại và KHÔNG PHẢI là lỗi đánh dấu trạng thái SDAM không xác định

Nếu nhóm không triển khai chuỗi nền, phương thức checkOut chịu trách nhiệm đảm bảo rằng nhóm có ít nhất minPoolSize

KHÔNG PHẢI được kiểm tra cho đến khi nó được thiết lập. Ngoài ra, Nhóm KHÔNG ĐƯỢC ngăn các luồng khác kiểm xuất trong khi thiết lập

Trước khi một giá trị nhất định được trả về từ thanh toán, giá trị này phải được đánh dấu là "đang sử dụng" và Số lượng kết nối khả dụng của nhóm PHẢI được giảm xuống

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
3

Một Nhóm PHẢI có phương pháp cho phép người lái xe đăng ký. Trình điều khiển KHÔNG ĐƯỢC phép đăng ký một Nhóm không tạo ra điều đó và PHẢI đưa ra Lỗi nếu điều này được thử

Khi được đăng ký, nó PHẢI là nếu bất kỳ điều nào sau đây là đúng

  • Cái đã diệt vong
  • hồ bơi đã bị đóng cửa

Mặt khác, được đánh dấu là có sẵn

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
4

Xóa nhóm bao gồm các bước khác nhau tùy thuộc vào việc nhóm có ở chế độ cân bằng tải hay không. Hành vi xóa cân bằng truyền thống/không tải KHÔNG ĐƯỢC sử dụng bởi các nhóm ở chế độ cân bằng tải và hành vi xóa nhóm cân bằng tải KHÔNG ĐƯỢC sử dụng trong các nhóm cân bằng không tải

Một nhóm PHẢI có phương pháp xóa tất cả khi được hướng dẫn. Thay vì lặp lại qua every , phương pháp này chỉ đơn giản là tăng việc tạo Pool, đánh dấu hoàn toàn tất cả hiện tại là cũ. Nó cũng sẽ chuyển trạng thái của nhóm thành "tạm dừng" để tạm dừng việc tạo kết nối mới cho đến khi được đánh dấu lại là "sẵn sàng". Các thuật toán checkOut và checkIn sẽ xử lý xóa cũ. Nếu người dùng đã đăng ký các sự kiện Giám sát kết nối và/hoặc thông báo nhật ký kết nối, PoolClearedEvent và thông báo nhật ký PHẢI được phát ra sau khi tăng quá trình tạo/đánh dấu nhóm là "tạm dừng". Nếu nhóm đã bị "tạm dừng" khi bị xóa, thì nhóm KHÔNG ĐƯỢC phát ra sự kiện PoolCleared hoặc thông báo nhật ký

Là một phần của việc xóa nhóm, WaitQueue cũng PHẢI được xóa, nghĩa là tất cả các yêu cầu trong WaitQueue PHẢI không thành công với các lỗi cho biết rằng nhóm đã bị xóa trong khi quá trình thanh toán đang được thực hiện. Lỗi được trả về do nhóm bị xóa PHẢI được coi là lỗi có thể thử lại và KHÔNG PHẢI là lỗi đánh dấu trạng thái SDAM không xác định. Xóa WaitQueue PHẢI diễn ra một cách háo hức để mọi thao tác đang chờ có thể thử lại ngay khi có thể. Nhóm KHÔNG ĐƯỢC dựa vào WaitQueueTimeoutMS để xóa các yêu cầu khỏi WaitQueue

Phương thức xóa PHẢI cung cấp tùy chọn ngắt bất kỳ kết nối đang sử dụng nào như một phần của quá trình xóa (từ đó được gọi là cờ ngắtInUseConnections trong thông số kỹ thuật này). "Ngắt kết nối" được định nghĩa là hủy bất kỳ tác vụ nào mà Kết nối hiện đang thực hiện và đánh dấu Kết nối là đã bị hỏng (e. g. bằng cách đóng ổ cắm bên dưới của nó). Việc ngắt các Kết nối này PHẢI được thực hiện càng sớm càng tốt nhưng KHÔNG ĐƯỢC chặn nhóm hoặc ngăn nhóm xử lý các yêu cầu tiếp theo. Nếu nhóm có một luồng nền và nó chịu trách nhiệm làm gián đoạn các kết nối đang sử dụng, thì lần chạy tiếp theo của nó PHẢI được lên lịch càng sớm càng tốt

The pool MUST only interrupt in-use Connections whose generation is less than or equal to the generation of the pool at the moment of the clear (before the increment) that used the interruptInUseConnections flag. Any operations that have their Connections interrupted in this way MUST fail with a retryable error. If possible, the error SHOULD be a PoolClearedError with the following message: "Connection to interrupted due to server monitor timeout".

Nhóm PHẢI cũng có phương pháp xóa tất cả cho một

interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 cụ thể để sử dụng khi ở chế độ cân bằng tải. Phương pháp này tăng việc tạo nhóm cho
interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 cụ thể đó trong bản đồ tạo. Một PoolClearedEvent và thông báo nhật ký PHẢI được phát ra sau khi tăng thế hệ. Lưu ý rằng phương pháp này KHÔNG ĐƯỢC chuyển nhóm sang trạng thái "tạm dừng" và KHÔNG ĐƯỢC xóa WaitQueue

Đối với triển khai cân bằng tải, nhóm PHẢI duy trì bản đồ từ

interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 đến một bộ (tạo, số lượng kết nối) trong đó số lượng kết nối đề cập đến tổng số kết nối tồn tại cho một
interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 cụ thể. Nhóm PHẢI xóa mục nhập cho
interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 sau khi số lượng kết nối đạt 0. Khi quá trình bắt tay MongoDB hoàn tất, kết nối PHẢI lấy số thế hệ áp dụng cho
interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 của nó từ bản đồ và cập nhật bản đồ để tăng số lượng kết nối cho
interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0 này

Xem chi tiết

A rõ ràng là không an toàn. Hành vi thích hợp trong trường hợp fork là ResetAfterFork bằng cách

  • xóa tất cả Nhóm kết nối trong quy trình con
  • đóng tất cả trong tiến trình con

Trình điều khiển hỗ trợ rẽ nhánh PHẢI ghi lại rằng Điểm cuối không an toàn với rẽ nhánh và ghi lại cách thích hợp để ResetAfterFork trong trình điều khiển

Trình điều khiển CÓ THỂ mạnh mẽ ResetafterFork nếu trình điều khiển phát hiện nó đã bị rẽ nhánh

Các tính năng sau của Nhóm kết nối NÊN được triển khai nếu chúng có ý nghĩa trong ngôn ngữ của trình điều khiển và trình điều khiển

Một nhóm NÊN có một Chủ đề nền chịu trách nhiệm theo dõi trạng thái của tất cả các. chủ đề nền này NÊN

  • Điền để đảm bảo rằng nhóm luôn thỏa mãn minPoolSize
  • Xóa và đóng các kết nối đã bị hỏng bao gồm cả các kết nối "đang sử dụng" nếu tùy chọn ngắtInUseConnections được đặt thành true trong lần xóa nhóm gần đây nhất
  • Áp dụng thời gian chờ để thiết lập kết nối mỗi

Một nhóm NÊN cho phép lập lịch ngay lập tức cho lần lặp lại luồng nền tiếp theo sau khi thực hiện xóa

Về mặt khái niệm, các hoạt động nói trên được tổ chức thành các Chạy chủ đề nền liên tiếp. Một lần Chạy PHẢI thực hiện nhiều công việc nhất có thể và sau đó kết thúc thay vì đợi thêm công việc. Ví dụ: thay vì chờ đợiPendingConnectionCount trở nên nhỏ hơn maxConnecting khi đáp ứng minPoolSize, Run PHẢI tiếp tục với phần còn lại của nhiệm vụ, ví dụ:. g. , đóng các kết nối bị hỏng có sẵn hoặc kết thúc

Khoảng thời gian giữa lúc kết thúc một lần chạy và bắt đầu lần chạy tiếp theo không được chỉ định, nhưng Định dạng kiểm tra và Thông số kỹ thuật của người chạy có thể hạn chế khoảng thời gian này hoặc đưa ra các hạn chế khác để tạo điều kiện thuận lợi cho việc kiểm tra

Một nhóm NÊN triển khai cơ chế quản lý tài nguyên có phạm vi phù hợp với ngôn ngữ của họ để ngăn chặn việc không được đăng ký. Các ví dụ bao gồm và câu lệnh "sử dụng" của C#. Nếu được triển khai, người lái xe NÊN sử dụng phương thức này làm phương thức đăng xuất và đăng nhập mặc định

Tất cả các trình điều khiển triển khai nhóm kết nối PHẢI cung cấp API cho phép người dùng đăng ký các sự kiện được phát ra từ nhóm. Nếu người dùng đăng ký các sự kiện Giám sát kết nối, những sự kiện này PHẢI được phát ra khi được chỉ định trong “Hành vi nhóm kết nối”. Các sự kiện NÊN được tạo và đăng ký theo cách phù hợp với ngôn ngữ và trình điều khiển của chúng

Xem chi tiết về trường

interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
0

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
5

Vui lòng tham khảo đặc tả ghi nhật ký để biết chi tiết về triển khai ghi nhật ký nói chung, bao gồm cấp độ nhật ký, thành phần nhật ký, xử lý các giá trị null trong thông điệp tường trình và ghi nhật ký có cấu trúc so với không cấu trúc

Trình điều khiển PHẢI hỗ trợ ghi nhật ký thông tin nhóm kết nối thông qua các loại thông báo tường trình sau. Các thông báo này PHẢI được ghi lại ở cấp độ

interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
8 và sử dụng thành phần nhật ký
interface ConnectionPoolOptions {
  /**
   *  The maximum number of threads that can simultaneously wait
   *  for a Connection to become available.
   */
  waitQueueSize?: number;

  /**
   *  An alternative way of setting waitQueueSize, it specifies
   *  the maximum number of threads that can wait per connection.
   *  waitQueueSize === waitQueueMultiple \* maxPoolSize
   */
  waitQueueMultiple?: number
}
9. Các thông báo này PHẢI được phát ra khi được chỉ định trong “Hành vi nhóm kết nối”

Các thông điệp bản ghi nhằm khớp với thông tin có trong các sự kiện ở trên. Trình điều khiển CÓ THỂ thực hiện hỗ trợ ghi nhật ký kết nối thông qua người đăng ký sự kiện nếu thuận tiện để làm như vậy

Các loại được sử dụng trong các định nghĩa thông báo có cấu trúc bên dưới là minh họa và trình điều khiển CÓ THỂ sử dụng các loại tương tự thay thế miễn là có thông tin (e. g. gấp đôi thay vì số nguyên hoặc chuỗi thay vì số nguyên nếu khung ghi nhật ký có cấu trúc không hỗ trợ các loại số)

Tất cả các thông báo nhật ký kết nối PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValueserverHostStringtên máy chủ, địa chỉ IP hoặc đường dẫn ổ cắm tên miền Unix cho điểm cuối mà nhóm dành cho. serverPortIntCổng cho điểm cuối nhóm dành cho. Không bắt buộc; . Khi người dùng không chỉ định một cổng và mặc định (27017) được sử dụng, trình điều khiển NÊN đưa nó vào đây

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Connection pool created"maxIdleTimeMSIntGiá trị maxIdleTimeMS cho nhóm này. Không bắt buộc; . minPoolSizeIntGiá trị minPoolSize cho nhóm này. Không bắt buộc; . maxPoolSizeIntGiá trị maxPoolSize cho nhóm này. Không bắt buộc; . maxConnectingIntGiá trị maxConnecting cho nhóm này. Không bắt buộc; . waitQueueTimeoutMSIntGiá trị waitQueueTimeoutMS cho nhóm này. Không bắt buộc; . waitQueueSizeIntGiá trị WaitQueueSize cho nhóm này. Không bắt buộc; . waitQueueMultipleInt Giá trị WaitQueueMultiple cho nhóm này. Không bắt buộc;

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Đã tạo nhóm kết nối cho {{serverHost}}. {{serverPort}} sử dụng tùy chọn maxIdleTimeMS={{maxIdleTimeMS}}, minPoolSize={{minPoolSize}}, maxPoolSize={{maxPoolSize}}, maxConnecting={{maxConnecting}}, waitQueueTimeoutMS={{waitQueueTimeoutMS}}, waitQueueSize={

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Chuỗi kết nối đã sẵn sàng"

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Nhóm kết nối đã sẵn sàng cho {{serverHost}}. {{cổng máy chủ}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Đã xóa nhóm kết nối"serviceIdString Biểu diễn chuỗi hex của ID dịch vụ mà nhóm đã bị xóa. Không bắt buộc;

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Nhóm kết nối cho {{serverHost}}. Đã xóa {{serverPort}} cho serviceId {{serviceId}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Đã đóng nhóm kết nối"

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Đã đóng nhóm kết nối cho {{serverHost}}. {{cổng máy chủ}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Connection created"driverConnectionIdIntID do trình điều khiển tạo cho kết nối như được xác định trong

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Đã tạo kết nối. địa chỉ={{máy chủ lưu trữ}}. {{serverPort}}, ID do trình điều khiển tạo ra={{driverConnectionId}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Connection ready"driverConnectionIdIntID do trình điều khiển tạo cho kết nối như được xác định trong

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Kết nối đã sẵn sàng. địa chỉ={{máy chủ lưu trữ}}. {{serverPort}}, ID do trình điều khiển tạo ra={{driverConnectionId}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Connection closed"driverConnectionIdIntID do trình điều khiển tạo cho kết nối như được xác định trong. lý doString

Một chuỗi mô tả lý do kết nối bị đóng. Các chuỗi sau PHẢI được sử dụng cho từng lý do có thể được xác định ở trên

  • Cũ. "Kết nối trở nên cũ vì nhóm đã bị xóa"
  • nhàn rỗi. "Kết nối đã khả dụng nhưng không được sử dụng lâu hơn thời gian nhàn rỗi tối đa được định cấu hình"
  • Lỗi. "Đã xảy ra lỗi khi sử dụng kết nối"
  • hồ bơi đóng cửa. "Nhóm kết nối đã bị đóng"
errorFlexibleIf
interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
0 is
interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
1, lỗi liên quan. Loại và định dạng của giá trị này là linh hoạt;

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Kêt nôi bị đong. địa chỉ={{máy chủ lưu trữ}}. {{serverPort}}, ID do trình điều khiển tạo ra={{driverConnectionId}}. Lý do. {{lý do}}. Lỗi. {{lỗi}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Đã bắt đầu kiểm tra kết nối"

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Đã bắt đầu thanh toán để kết nối với {{serverHost}}. {{cổng máy chủ}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Kiểm tra kết nối không thành công"reasonString

Một chuỗi mô tả lý do thanh toán. Các chuỗi sau PHẢI được sử dụng cho từng lý do có thể được xác định ở trên

  • Hết giờ. "Đã hết thời gian chờ của hàng đợi mà không có kết nối"
  • Lỗi kết nối. "Đã xảy ra lỗi khi cố gắng thiết lập kết nối mới"
  • hồ bơi đóng cửa. "Nhóm kết nối đã bị đóng"
errorFlexibleIf
interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
0 is
interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
3, lỗi liên quan. Loại và định dạng của giá trị này là linh hoạt;

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Thanh toán không thành công khi kết nối với {{serverHost}}. {{cổng máy chủ}}. Lý do. {{lý do}}. Lỗi. {{lỗi}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Đã kiểm tra kết nối"driverConnectionIdIntID do trình điều khiển tạo cho kết nối như được xác định trong

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Đã kiểm tra kết nối. địa chỉ={máy chủ}}. {{serverPort}}, ID do trình điều khiển tạo ra={{driverConnectionId}}

Ngoài các trường phổ biến được xác định ở trên, thông báo này PHẢI chứa các cặp khóa-giá trị sau

KeySuggested TypeValuemessageString"Kết nối đã đăng ký"driverConnectionIdIntID do trình điều khiển tạo cho kết nối như được xác định trong

Biểu mẫu không có cấu trúc NÊN như sau, sử dụng các giá trị được xác định trong định dạng có cấu trúc ở trên để điền vào chỗ dành sẵn cho phù hợp

Đã đăng ký kết nối. địa chỉ={{máy chủ lưu trữ}}. {{serverPort}}, ID do trình điều khiển tạo ra={{driverConnectionId}}

Nhóm kết nối đưa ra lỗi trong các trường hợp cụ thể. Các lỗi này PHẢI được phát ra bởi nhóm. Các lỗi NÊN được tạo và gửi đi theo cách đặc trưng cho Trình điều khiển và Ngôn ngữ

interface ConnectionPoolOptions {
  /**
   *  NOTE: This option has been deprecated in favor of timeoutMS.
   *
   *  The maximum amount of time a thread can wait for a connection
   *  to become available.
   *  If specified, MUST be a number >= 0.
   *  A value of 0 means there is no limit.
   *  Defaults to 0.
   */
  waitQueueTimeoutMS?: number;
}
6

Xem các bài kiểm tra/README. đầu tiên

Hiện tại, chúng tôi đang cố gắng mã hóa hành vi tổng hợp hiện tại của mình với những thay đổi tối thiểu và minPoolSize hiện thống nhất trên tất cả các thành viên của replicaSet. Điều này có lợi ích trong việc bù đắp kết nối tràn ngập trong Bước xuống chính, điều này sẽ được giải quyết thêm trong phần của chúng tôi

ConnectionCreated và ConnectionReady mỗi liên quan đến các thay đổi trạng thái khác nhau trong nhóm

  • ConnectionCreated thêm một “pending” mới, có nghĩa là tổngConnectionCount vàendingConnectionCount tăng thêm một
  • ConnectionReady thiết lập rằng sẵn sàng để sử dụng, có nghĩa là sốConnectionCount khả dụng tăng thêm một

ConnectionClosed chỉ ra rằng không còn là thành viên của nhóm, giảm tổngConnectionCount và có khả năng có sẵnConnectionCount. Sau thời điểm này, không còn là một phần của nhóm. Các sự kiện giả định khác sẽ không chỉ ra sự thay đổi trạng thái của nhóm, vì vậy chúng không được chỉ định ở đây

Các tùy chọn này ban đầu chỉ được triển khai trong ba trình điều khiển (Java, C# và Python) và cung cấp ít giá trị. Mặc dù các trường này sẽ cho phép chẩn đoán nhanh hơn các sự cố trong nhóm kết nối, nhưng thực tế chúng sẽ không ngăn lỗi xảy ra

Ngoài ra, các tùy chọn này có tác dụng ưu tiên các yêu cầu cũ hơn các yêu cầu mới hơn, đây không nhất thiết là hành vi mà người dùng muốn. Chúng cũng có thể dẫn đến trường hợp quyền truy cập hàng đợi dao động qua lại giữa đầy đủ và không đầy đủ. Nếu trình điều khiển có hàng đợi đầy đủ, thì tất cả các yêu cầu sẽ bị từ chối. Nếu ứng dụng khách liên tục bị gửi thư rác với các yêu cầu, bạn có thể gặp phải một tình huống trong đó ngay khi WaitQueue không còn đầy, nó sẽ được lấp đầy ngay lập tức. Đây không phải là một tình huống thuận lợi, một phần b/c nó vi phạm sự đảm bảo công bằng mà waitQueue thường cung cấp

Vì những vấn đề này, nó không có ý nghĩa để. Cuối cùng, chúng tôi có thể theo đuổi một cấu hình thay thế để giải quyết kích thước hàng đợi trong

Người dùng muốn có chức năng này có thể đạt được kết quả tương tự bằng cách sử dụng các phương pháp khác để hạn chế đồng thời. Các ví dụ bao gồm triển khai nhóm luồng hoặc hàng đợi hoạt động với kích thước giới hạn trong ứng dụng người dùng. Trình điều khiển cần ngừng sử dụng

interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
4 và/hoặc
interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
5 NÊN giới thiệu người dùng đến các ví dụ này

Chúng tôi dự đoán cuối cùng sẽ giới thiệu một cơ chế hết thời gian chờ phía máy khách, khiến chúng tôi ngần ngại giới thiệu một cơ chế kiểm soát thời gian chờ chi tiết khác. Do đó, nếu một trình điều khiển/ngôn ngữ đã có một cách thành ngữ để triển khai thời gian chờ của họ, thì họ nên tận dụng cơ chế đó để triển khai waitQueueTimeoutMS

Không sử dụng chuỗi nền, nhóm có đủ kết nối để đáp ứng kích thước minPoolSize trong quá trình thanh toán. Tuy nhiên, chúng được thiết lập như một phần của quá trình tạo nhóm, vì vậy nếu việc thiết lập được thực hiện theo kiểu chặn, các hoạt động đầu tiên sau khi xóa nhóm sẽ có độ trễ cao không thể chấp nhận được, đặc biệt đối với các giá trị lớn hơn của minPoolSize. Do đó, việc điền vào nhóm phải xảy ra trên một luồng nền (có thể chấp nhận chặn) hoặc thông qua việc sử dụng I/O không chặn (không đồng bộ)

Vì không sử dụng và bị hỏng được dọn sạch như một phần của checkOut, nên thực hiện chặn I/O trong khi đóng như vậy sẽ chặn các luồng ứng dụng, gây ra độ trễ không cần thiết. Sau khi a được đánh dấu là "đã đóng", nó sẽ không được kiểm tra lại, do đó, việc đảm bảo ổ cắm bị phá bỏ không cần phải xảy ra ngay lập tức và có thể xảy ra sau đó, thông qua I/O không đồng bộ hoặc luồng nền

Sự khác biệt giữa trạng thái "tạm dừng" và trạng thái "sẵn sàng" cho phép nhóm xác định xem điểm cuối mà nó được liên kết có khả dụng hay không. Điều này cho phép các hành vi sau đây

  1. Nhóm có thể tạm dừng việc tạo các cơ sở kết nối nền cho đến khi điểm cuối khả dụng trở lại. Nếu không có trạng thái "tạm dừng", nhóm sẽ không có cách nào xác định thời điểm bắt đầu thiết lập lại kết nối nền, do đó, nhóm sẽ liên tục cố gắng và thường thất bại trong việc tạo kết nối cho đến khi thỏa mãn minPoolSize, ngay cả sau nhiều lần thất bại. Điều này có thể gây lãng phí tài nguyên không cần thiết cho cả phía máy chủ và trình điều khiển
  2. Nhóm có thể loại bỏ các yêu cầu vào WaitQueue sau khi nhóm đã bị xóa nhưng trước khi máy chủ trở lại trạng thái đã biết. Những yêu cầu như vậy có thể xảy ra khi một máy chủ được chọn cùng lúc với việc nó được đánh dấu là Không xác định trong khối lượng công việc đồng thời cao. Nếu không có trạng thái "tạm dừng", nhóm sẽ cố gắng phục vụ các yêu cầu này, vì nhóm sẽ cho rằng chúng được định tuyến đến nhóm vì điểm cuối của nhóm có sẵn, chứ không phải do cuộc chạy đua giữa SDAM và Lựa chọn máy chủ. Các yêu cầu này sau đó có thể sẽ không thành công với độ trễ tiềm ẩn cao, một lần nữa gây lãng phí tài nguyên cho cả phía máy chủ và trình điều khiển

Nếu một nhóm đã bị tạm dừng khi nó bị xóa, điều đó có nghĩa là nó đã bị xóa trước đó và không có kết nối mới nào được tạo kể từ đó. Do đó, việc xóa nhóm trong trường hợp này về cơ bản là không hoạt động, vì vậy không cần thông báo cho bất kỳ người nghe nào rằng nó đã xảy ra. Tuy nhiên, thế hệ vẫn được tăng lên để đảm bảo các lỗi trong tương lai gây ra việc xóa trùng lặp sẽ ngừng cố gắng xóa lại nhóm. Tình huống này có thể xảy ra nếu nhóm bị xóa bởi chuỗi nền sau khi gặp phải lỗi khi thiết lập kết nối, nhưng Mô tả máy chủ cho điểm cuối chưa được cập nhật tương ứng

Nếu một trình giám sát SDAM đã quan sát thấy thời gian chờ của mạng, chúng tôi cho rằng tất cả các kết nối bao gồm cả các kết nối "đang sử dụng" không còn hoạt động bình thường. Trong một số trường hợp, các kết nối sẽ không phát hiện được thời gian chờ mạng đủ nhanh. Ví dụ: một yêu cầu máy chủ có thể bị treo ở cấp hệ điều hành trong vòng lặp thử lại TCP trong 17 phút trước khi không thành công. Do đó, các kết nối này PHẢI chủ động bị gián đoạn trong trường hợp hết thời gian chờ của mạng giám sát máy chủ. Yêu cầu chạy backround thread ngay lập tức sẽ tăng tốc quá trình này

Lý tưởng nhất là TCP_USER_TIMEOUT hợp lý có thể giúp phát hiện các kết nối cũ như một giải pháp thay thế cho ngắtInUseConnections trong Clear. Thật không may, phương pháp này phụ thuộc vào nền tảng và không phải trình điều khiển nào cũng cho phép dễ dàng định cấu hình nó. Ví dụ: trình điều khiển C# chỉ có thể định cấu hình tùy chọn ổ cắm này trên linux với các khung mục tiêu cao hơn hoặc bằng. lưới 5. 0. Trên macOS, không có giá trị tương đương trực tiếp cho tùy chọn này, có thể chúng ta có thể tìm thấy một số cấu hình tương đương, nhưng cấu hình này cũng sẽ yêu cầu các khung mục tiêu cao hơn hoặc bằng. lưới 5. 0. Ưu điểm của việc sử dụng Chủ đề nền để quản lý các kết nối bị hỏng là nó sẽ hoạt động bất kể thiết lập môi trường

Như đã đề cập trong phần , một số trình điều khiển hiện triển khai các tùy chọn

interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
4 và/hoặc
interface Connection {
  /**
   *  An id number associated with the Connection
   */
  id: number;

  /**
   *  The address of the pool that owns this Connection
   */
  address: string;

  /**
   *  An integer representing the “generation” of the pool
   *  when this Connection was created.
   */
  generation: number;

  /**
   * The current state of the Connection.
   *
   * Possible values are the following:
   *   - "pending":       The Connection has been created but has not yet been established. Contributes to
   *                      totalConnectionCount and pendingConnectionCount.
   *
   *   - "available":     The Connection has been established and is waiting in the pool to be checked
   *                      out. Contributes to both totalConnectionCount and availableConnectionCount.
   *
   *   - "in use":        The Connection has been established, checked out from the pool, and has yet
   *                      to be checked back in. Contributes to totalConnectionCount.
   *
   *   - "closed":        The Connection has had its socket closed and cannot be used for any future
   *                      operations. Does not contribute to any connection counts.
   *
   * Note: this field is mainly used for the purposes of describing state
   * in this specification. It is not required that drivers
   * actually include this field in their implementations of Connection.
   */
  state: "pending" | "available" | "in use" | "closed";
}
5. Các tùy chọn này sẽ không được dùng nữa và bị loại bỏ dần khỏi các trình điều khiển đã triển khai chúng

  • Java (JAVA-3079)
  • RUBY (RUBY-1560)

Thông số kỹ thuật này không chỉ ra cách quản lý các kết nối Giám sát SDAM. SDAM chỉ định rằng “Màn hình KHÔNG NÊN sử dụng nhóm Kết nối thông thường của máy khách”. Một số giải pháp khả thi cho việc này bao gồm

  • Có mỗi đại diện Điểm cuối trong trình điều khiển tạo và quản lý riêng biệt dành riêng cho mục đích giám sát
  • Có mỗi đại diện Điểm cuối trong trình điều khiển duy trì một nhóm maxPoolSize 1 riêng biệt cho mục đích giám sát
  • Có mỗi Nhóm duy trì một mục đích giám sát dành riêng, với API để hiển thị Kết nối đó

Thông số kỹ thuật này không giải quyết tất cả các hành vi tổng hợp nâng cao như tổng hợp dự đoán hoặc tạo tích cực. Công việc trong tương lai có thể giải quyết vấn đề này

Exhaust Cursors có thể yêu cầu những thay đổi đối với cách chúng tôi đóng trong tương lai, cụ thể là thêm một cách để đóng và xóa khỏi nhóm a có thông báo xả chưa đọc

Nhóm kết nối MongoDB là gì?

Định nghĩa. Nhóm kết nối là bộ đệm chứa các kết nối cơ sở dữ liệu mở, sẵn sàng sử dụng do trình điều khiển duy trì . Ứng dụng của bạn có thể liên tục nhận các kết nối từ nhóm, thực hiện các thao tác và trả kết nối trở lại nhóm. Nhóm kết nối an toàn theo luồng.

MongoDB có thể xử lý bao nhiêu kết nối?

Cụm M2 của bạn có ba nút với giới hạn 500 kết nối trên mỗi nút. Atlas dự trữ 10 kết nối trên mỗi nút. Nếu bạn đặt tùy chọn đọc của mình thành phụ, Atlas có thể đọc từ hai nút phụ cho giới hạn kết nối 980 kết hợp .

MongoClient hoạt động như thế nào?

Mô-đun MongoDB xuất MongoClient và đó là những gì chúng tôi sẽ sử dụng để kết nối với cơ sở dữ liệu MongoDB . Chúng ta có thể sử dụng một phiên bản của MongoClient để kết nối với một cụm, truy cập cơ sở dữ liệu trong cụm đó và đóng kết nối với cụm đó.

Làm thế nào để tổng hợp kết nối hoạt động trong PyMongo?

Tính năng tổng hợp kết nối hoạt động như thế nào trong PyMongo? . Các nhóm này mở socket theo yêu cầu để hỗ trợ số lượng hoạt động MongoDB đồng thời mà ứng dụng đa luồng của bạn yêu cầu. Every MongoClient instance has a built-in connection pool per server in your MongoDB topology. These pools open sockets on demand to support the number of concurrent MongoDB operations that your multi-threaded application requires.