在组通信领域,JGroups作为可靠的多播通信工具集享有盛名。JGroups的一大特点就是其灵活的协议栈 Protocol stack, 灵活固然好,有时不明就里,胡乱搭配,反而不妙。
所以,要搞清楚协议的应用场景和参数配置意义,举例如下
<config> <UDP mcast_port="${jgroups.udp.mcast_port:45588}" tos="8" ucast_recv_buf_size="20M" ucast_send_buf_size="640K" mcast_recv_buf_size="25M" mcast_send_buf_size="640K" loopback="true" discard_incompatible_packets="true" max_bundle_size="64K" max_bundle_timeout="30" ip_ttl="${jgroups.udp.ip_ttl:2}" enable_bundling="true" enable_diagnostics="true" thread_naming_pattern="cl" timer.num_threads="4" thread_pool.enabled="true" thread_pool.min_threads="2" thread_pool.max_threads="8" thread_pool.keep_alive_time="5000" thread_pool.queue_enabled="true" thread_pool.queue_max_size="10000" thread_pool.rejection_policy="discard" oob_thread_pool.enabled="true" oob_thread_pool.min_threads="1" oob_thread_pool.max_threads="8" oob_thread_pool.keep_alive_time="5000" oob_thread_pool.queue_enabled="false" oob_thread_pool.queue_max_size="100" oob_thread_pool.rejection_policy="Run"/> <PING timeout="2000" num_initial_members="3"/> <MERGE2 max_interval="30000" min_interval="10000"/> <FD_SOCK/> <FD_ALL/> <VERIFY_SUSPECT timeout="1500" /> <BARRIER /> <pbcast.NAKACK use_stats_for_retransmission="false" exponential_backoff="0" use_mcast_xmit="true" gc_lag="0" retransmit_timeout="300,600,1200" discard_delivered_msgs="true"/> <UNICAST timeout="300,600,1200"/> <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000" max_bytes="1M"/> <pbcast.GMS print_local_addr="false" join_timeout="3000" view_bundling="true"/> <FC max_credits="500K" min_threshold="0.20"/> <FRAG2 frag_size="60K" /> <pbcast.STREAMING_STATE_TRANSFER /> <!--pbcast.STATE_TRANSFER /--> <!-- pbcast.FLUSH /--> </config>
1. UDP 协议,学过计算机网络的人都知道UDP是传输层的基本协议,特点就是快但不一定可靠, 这里是用基于UDP的多播multicast协议来发送消息的, 也可以改成其他传输协议,如 tcp, tcp_nio, tunnel
This is the transport protocol. It uses IP multicasting to send messages to the entire cluster, or individual nodes. Other transports include TCP, TCP_NIO and TUNNEL.
2. PING协议, 用缺省的IP多播来发现最初的成员, 类似于操作系统的 ping 命令,一旦ping通,则一个单播join请求将被发送至它以加入当前的 group 或者叫做cluster
Uses IP multicast (by default) to find initial members. Once found, the current coordinator can be determined and a unicast JOIN request will be sent to it in order to join the cluster.
3. MERGE2, 用来合并子组,或在一个子组分离时去除子组
Will merge subgroups back into one group, kicks in after a cluster partition.
4. FD_SOCK 基于socket 的错误检测协议 (在成员之间形成的一个环),当某个成员失败时会生成通知Failure detection based on sockets (in a ring form between members). Generates notification if a member fails
5. FD 基于心跳 heartbeat 和 你还活着 are-you-live 消息的错误检测协议 (在成员之间形成的一个环),当某个成员失败时会生成通知Failure detection based on heartbeats and are-you-alive messages (in a ring form between members). Generates notification if a member fails
6. VERIFY_SUSPECT 重复检测一个挂起的成员 是否 已经死掉了, 否则以下协议产生的消息将被丢弃Double-checks whether a suspected member is really dead, otherwise the suspicion generated from protocol below is discarded
7. pbcast.NAKACK 确保消息的可靠和 FIFO 顺序 , 消息可靠性保证了一个消息会被收到,否则接收者会要求重传,FIFO保证了从发送者发过来的所有消息会以相同顺序到达接收方
Ensures (a) message reliability and (b) FIFO. Message reliability guarantees that a message will be received. If not, the receiver(s) will request retransmission. FIFO guarantees that all messages from sender P will be received in the order P sent them
8. UNICAST 与NAKACK差不多,只不过它不是多播,而是单播的Same as NAKACK for unicast messages: messages from sender P will not be lost (retransmission if necessary) and will be in FIFO order (conceptually the same as TCP in TCP/IP)
9. pbcast.STABLE 将已被所有成员收到的消息删除,即分布式垃圾回收Deletes messages that have been seen by all members (distributed message garbage collection)
10. pbcast.GMS 成员协议,负责成员的 加入/离开 并更新新的成员视图Membership protocol. Responsible for joining/leaving members and installing new views.
11. FRAG2 将巨大的消息打碎分割成若干个小的发送,并在接收端重新组装回去,适用于多播和单播协议Fragments large messages into smaller ones and reassembles them back at the receiver side. For both multicast and unicast messages
12. STATE_TRANSFER 状态传输,确保状态可以正确地从一个成员传输到其他的成员
Ensures that state is correctly transferred from an existing member (usually the coordinator) to a new member