Là giao thức điều phối sharding qua GRPC. Bao gồm 2 thành phần: client và server

Mọi request của client sẽ đính kèm một header: shard_key và gửi tới server s.

s được tính toán dựa trên key (account_id hoặc user_id, ...) và tổng số lượng shard.

$$ s = CRC32(accountId)\ mod\ numShard $$

import "hash/crc32"
var crc32q = crc32.MakeTable(crc32.IEEE)
crc32.Checksum([]byte(account_id), crc32q) % NUM_SHARD

Giả sử account_id là acc3234234234 số lượng shard là 16 thì server phù hợp để gửi tới là: 5

fmt.Println(crc32.Checksum([]byte("acc3234234234"), crc32q) % 16) // 5

Mỗi shard server phải nhất quán về tổng số lượng shard (nếu không đảm bảo được 100% thì phải cố gắng giảm thiểu xác suất này xuống thấp nhất có thể). Khi server nhận được request từ client, việc đầu tiên nó làm tìm server đúng của request dựa vào header shard_key.

Client gửi sai shard_id có 2 khả năng xảy ra:

  1. Thuật toán sharding của client và server không giống nhau
  2. Số lượng shard ở client và server không giống nhau

Trường hợp 1, request của client vẫn được thực hiện thành công, nhưng phải đi qua một tầng forward, thiếu hiệu quả hơn một chút. Ở trường hợp 2, client sẽ dần dần đồng bộ shard_num với server ⇒ chỉ forward tức thời sau đó gửi thẳng tới server phù hợp.

Ví dụ

Hình dưới môt tả client gửi request GRPC, đính kèm header shard_key và gửi tới đúng server phụ trách shard_key đó.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/44148a29-e2dc-44bd-b2df-7a03f91fa94c/Untitled.png

Hình dưới mô tả một client ban đầu gửi request tới sai server, server không phụ trách shard_key forward lời gọi về đúng server. Đồng thời đính kèm thêm shard_num vào response trả về. Client sau đó tính toán lại shard_key và từ các request sau, nó gửi trực tiếp tới server phù hợp.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f95f32e0-7d76-4852-abd3-bca25eb430cd/Untitled.png