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
.
shard_num
là số lượng shard thực tếClient gửi sai shard_id
có 2 khả năng xảy ra:
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.
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
đó.
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.