一个分布式系统,不可能同时满足CAP
逐步补充
Gossip 协议又称 epidemic 协议(epidemic protocol),是基于流行病传播方式的节点或者进程之间信息交换的协议,在P2P网络和分布式系统中应用广泛,它的方法论也特别简单:
x在一个处于有界网络的集群里,如果每个节点都随机与其他节点交换特定信息,经过足够长的时间后,集群各个节点对该份信息的认知终将收敛到一致。
每个节点都有一个唯一的名字。节点名字是一个十六进制表示的160 bit 随机数。
节点会把它的ID保存在配置文件里,以后永远使用这个ID,只要这个节点配置文件没有被系统管理员删除掉。
每个节点都有其他相关信息是所有节点都知道的:
使用 CLUSTER NODES 命令可以获得以上的一些信息
xxxxxxxxxx
$ redis-cli cluster nodes
d1861060fe6a534d42d8a19aeb36600e18785e04 127.0.0.1:6379 myself - 0 1318428930 1 connected 0-1364
3886e65cc906bfd9b1f7e7bde468726a052d1dae 127.0.0.1:6380 master - 1318428930 1318428931 2 connected 1365-2729
d289c575dcbc4bdd2931585fd4339089e461a27d 127.0.0.1:6381 master - 1318428931 1318428931 3 connected 2730-4095
Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接
在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接。 这些 TCP 连接会永久保持,并不是按需创建的。
/* Message types.
*
* Note that the PING, PONG and MEET messages are actually the same exact
* kind of packet. PONG is the reply to ping, in the exact format as a PING,
* while MEET is a special PING that forces the receiver to add the sender
* as a node (if it is not already in the list). */
/* Ping */
/* Pong (reply to Ping) */
/* Meet "let's join" message */
/* Mark node xxx as failing */
/* Pub/Sub Publish propagation */
/* May I failover? */
/* Yes, you have my vote */
/* Another node slots configuration */
/* Pause clients for manual failover */
/* Module cluster API message. */
/* Pub/Sub Publish shard propagation */
/* Total number of message types. */
CAP一般讨论分布式存储一致性问题。扩展到经典业务场景,比如分布式系统中,购买后发道具:购买成功后发放5个道具,用户查询领取情况,保证最终发放成功。
对于这个异步场景来说,应优先保证可用性和分区容错性,确保数据最终一致性即可
解决