Docs Menu
Docs Home
/ / /
Kotlin Sync Driver
/ /

Customize Server Selection

All MongoDB drivers follow a defined algorithm when selecting a server to read or write from. By using the ClusterSettings property of a MongoClientSettings object, you can customize this algorithm to choose the server that works best for your application.

Important

Customizing the server selection algorithm might have unintended consequences, such as degraded read or write performance.

When the Kotlin Sync driver executes a read operation, it performs the following steps, in order, to select a MongoDB deployment:

  1. Selects all servers that match the active read preference from the list of known servers.

  2. If at least one readable server exists, calls the user-defined server-selector function and passes in the list from the previous step

  3. Applies the localThreshold connection setting to the list of servers returned from the function

  4. Selects a server at random from the servers still on the list and executes the operation against this server

When the Kotlin Sync driver executes a write operation, it begins by selecting all writeable servers from the list of known servers, not just those that match the active read preference. The remaining steps are identical to the preceding list.

To learn more about the default server selection algorithm, which the driver follows when you don't specify any custom server selection logic, see Server Selection Algorithm in the MongoDB Server manual.

You can implement your own custom server selection logic by creating a class that implements the ServerSelector interface and overrides the select() method. The following example shows a simple custom server selection class that selects servers with a type value of ServerType.REPLICA_SET_SECONDARY:

class CustomServerSelector : ServerSelector {
override fun select(cluster: ClusterDescription): List<ServerDescription> {
return cluster.serverDescriptions.filter { it.type == ServerType.REPLICA_SET_SECONDARY }
}
}

Use the applyToClusterSettings() method to pass an instance of this class to your MongoClientSettings. The following example shows how to create a MongoClient with an instance of the custom server selector class from the preceding example:

val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString("<connection URI>"))
.applyToClusterSettings { builder ->
builder.serverSelector(CustomServerSelector())
}
.build()
val mongoClient = MongoClient.create(settings)

You can specify the following server selection settings in your MongoClient object or in your connection URI:

Setting
Description

localThreshold

The latency window for server eligibility. If a server's round trip takes longer
than the fastest server's round-trip time plus this value, the server isn't
eligible for selection.

Data Type: Integer
Default: 15 milliseconds
Connection URI Example: localThresholdMS=0

readPreference

The client's default read-preference settings. For more information on read preference options, see Read Preference in the MongoDB Server manual.

Default: ReadPreference.primary()
Connection URI Example:
readPreference=primaryPreferred
&maxStalenessSeconds=90
&readPreferenceTags=dc:ny,rack:1

serverSelectionTimeout

The length of time the driver tries to select a server before timing out.

Data Type: Long
Default: 30 seconds
Connection URI Example: serverSelectionTimeoutMS=15000

To learn more about the classes and methods used in this guide, see the following API documentation:

Back

Network Compression

On this page