diff --git a/apps/webapp/app/services/realtimeClient.server.ts b/apps/webapp/app/services/realtimeClient.server.ts index f6df277189..ab777e0277 100644 --- a/apps/webapp/app/services/realtimeClient.server.ts +++ b/apps/webapp/app/services/realtimeClient.server.ts @@ -292,7 +292,7 @@ export class RealtimeClient { ): URL { const $url = new URL(url.toString()); - const electricOrigin = this.#resolveElectricOrigin(environment.id); + const electricOrigin = this.#resolveElectricOrigin($url, whereClause, environment.id); const electricUrl = new URL(`${electricOrigin}/v1/shape`); // Copy over all the url search params to the electric url @@ -483,14 +483,30 @@ export class RealtimeClient { return `${this.options.keyPrefix}:${environmentId}`; } - #resolveElectricOrigin(environmentId: string) { + #resolveElectricOrigin(url: URL, whereClause: string, environmentId: string) { if (typeof this.options.electricOrigin === "string") { return this.options.electricOrigin; } - const index = jumpHash(environmentId, this.options.electricOrigin.length); + const shardKey = this.#getShardKey(whereClause, environmentId); - return this.options.electricOrigin[index] ?? this.options.electricOrigin[0]; + const index = jumpHash(shardKey, this.options.electricOrigin.length); + + const origin = this.options.electricOrigin[index] ?? this.options.electricOrigin[0]; + + logger.debug("[realtimeClient] resolveElectricOrigin", { + whereClause, + environmentId, + shardKey, + index, + electricOrigin: origin, + }); + + return origin; + } + + #getShardKey(whereClause: string, environmentId: string) { + return [environmentId, whereClause].join(":"); } #registerCommands() { diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9338816649..26fbf25230 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -48,7 +48,7 @@ services: electric: container_name: electric - image: electricsql/electric:1.0.13@sha256:4e69c4a6ec3e976efbdd8b7e6de427e771aeacdbc0c8c7ca22eb0ca6ab1611ff + image: electricsql/electric:1.0.22@sha256:1b151dc8a6fd5292fba70cbc744e25bd3a1e42db5fc89b7e479b7b939980a0e2 restart: always environment: DATABASE_URL: postgresql://postgres:postgres@database:5432/postgres?sslmode=disable @@ -60,6 +60,21 @@ services: depends_on: - database + electric-shard-1: + container_name: electric-shard-1 + image: electricsql/electric:1.0.22@sha256:1b151dc8a6fd5292fba70cbc744e25bd3a1e42db5fc89b7e479b7b939980a0e2 + restart: always + environment: + DATABASE_URL: postgresql://postgres:postgres@database:5432/postgres?sslmode=disable + ELECTRIC_INSECURE: true + ELECTRIC_REPLICATION_STREAM_ID: "triggershard1" + networks: + - app_network + ports: + - "3061:3000" + depends_on: + - database + clickhouse: image: bitnami/clickhouse:latest container_name: clickhouse