java语言组播技术 和 JGroups.docx
- 文档编号:8679491
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:209.71KB
java语言组播技术 和 JGroups.docx
《java语言组播技术 和 JGroups.docx》由会员分享,可在线阅读,更多相关《java语言组播技术 和 JGroups.docx(18页珍藏版)》请在冰豆网上搜索。
java语言组播技术和JGroups
IP数据包传输类型
IPv4定义了3种IP数据包的传输:
单播(unicast)
广播(broadcast)
组播(multicast).
比较一下unicast和multicast两种数据的传输方式可以发现,
当一台主机向多个用户发送信息时,单播对于每一个用户都
要发送一份数据的拷贝,而组播总共只需发送一份数据的拷贝。
这样,组播的使用就大大的节省了带宽,减轻了网络的负载,
从而更加有效的利用了网络的带宽资源.
IP组播和单播的目的地址不同,IP组播的目的地址是组地址.
是从224.0.0.0到239.255.255.255之间的D类IP地址,其中
224.0.0.0到224.0.0.255是被保留的地址,224.0.0.1表示子
网中所有的组播组,224.0.0.2表示子网中的所有路由器,
224.0.0.5表示OSPF(OpenShortestPathFirst)路由器,
224.0.0.6表示OSPF指定路由器,224.0.0.12表示DHCP服务器.
在D类地址的分配中,IETF建议遵循以下的原则:
全球范围:
224.0.1.0~238.255.255.255;
有限范围:
239.0.0.0~239.255.255.255;
本地站点范围:
239.253.0.0~239.253.0.16
本地机构范围:
239.192.0.0~239.192.0.14.
Java组播程序的例子
importjava.io.IOException;
import.DatagramPacket;
import.InetAddress;
import.MulticastSocket;
import.NetworkInterface;
publicclassLearn2{
publicstaticvoidmain(String[]args)throwsIOException{
newMulticastServer().start();
newMulticastClient().start();
}
}
classMulticastServerextendsThread{
publicvoidrun(){
try{
MulticastSocketmcastSocket=newMulticastSocket(7777);
InetAddressinetAddress=InetAddress.getByName("230.0.0.1");
mcastSocket.setNetworkInterface(NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
mcastSocket.joinGroup(inetAddress);
while(true){
byte[]arb=newbyte[100];
DatagramPacketdatagramPacket=newDatagramPacket(arb,arb.length);
mcastSocket.receive(datagramPacket);
System.out.println("Server:
"+newString(arb,0,datagramPacket.getLength()));
}
}catch(Exceptiondx){
dx.printStackTrace();
}
}
}
classMulticastClientextendsThread{
publicvoidrun(){
try{
while(true){
byte[]arb=newbyte[]{'h','e','l','l','o'};
InetAddressinetAddress=InetAddress.getByName("230.0.0.1");
DatagramPacketdatagramPacket=newDatagramPacket(arb,arb.length,inetAddress,7777);
MulticastSocketmulticastSocket=newMulticastSocket();
multicastSocket.send(datagramPacket);
Thread.sleep(1000);
}
}catch(Exceptiondx){
dx.printStackTrace();
}
}
}
使用jgroups的例子
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importorg.jgroups.Address;
importorg.jgroups.ChannelException;
importorg.jgroups.JChannel;
importorg.jgroups.Message;
importorg.jgroups.ReceiverAdapter;
importorg.jgroups.View;
publicclassLearn1{
privateJChannelchannel=null;
publicLearn1()throwsChannelException{
channel=newJChannel("c:
/udp.xml");
}
publicstaticvoidmain(String[]args)throwsChannelException{
Learn1learn=newLearn1();
learn.startup();
newSendMessage(learn.channel).start();
}
privatevoidstartup()throwsChannelException{
channel.setReceiver(newReceiverMessage());
//channel.setOpt(option,value);
channel.connect("FL");
}
}
classReceiverMessageextendsReceiverAdapter{
publicvoidreceive(Messagemsg){
System.out.println(msg.getSrc()+":
"+msg.getObject()+"at"+System.currentTimeMillis());
}
publicvoidviewAccepted(Viewnew_view){
System.out.println("viewAccepted:
"+new_view);
}
publicvoidsuspect(Addresssuspected_mbr){
System.out.println("suspect:
"+suspected_mbr);
}
}
classSendMessageextendsThread{
privateJChannelchannel;
publicSendMessage(JChannelchannel){
this.channel=channel;
}
publicvoidrun(){
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
while(true){
try{
System.out.print(">");System.out.flush();
Stringline=in.readLine().toLowerCase();
if(line.startsWith("quit")||line.startsWith("exit")){
System.exit(0);
}
Messagemsg=newMessage(null,null,line);
channel.send(msg);
}catch(Exceptiondx){
dx.printStackTrace();
}
}
}
}
使用的udp.xml及相关参数说明
--
DefaultstackusingIPmulticasting.Itissimilartothe"udp"
stackinstacks.xml,butdoesn'tusestreamingstatetransferandflushing
author:
BelaBan
version:
$Id:
udp.xml,v1.24.2.12007/11/2008:
53:
40belabanExp$
-->
--
UDP协议设置
ip_mcast:
指定是否使用ip多播,defaulttrue
也可以通过TCP连接发送多个单播消息到成员,TCP也可以发送多播消息,但是这不是标准。
mcast_addr:
多播地址缺省:
228.8.8.8;
mcast_port:
多播端口缺省:
7600
ucast_recv_buf_size="20000000"//单播接收缓冲区大小缺省:
64000
ucast_send_buf_size="640000"//单播发送缓冲区大小缺省:
32000
mcast_recv_buf_size="25000000"//组播接收缓冲区大小缺省:
64000
mcast_send_buf_size="640000"//组播发送缓冲区大小缺省:
32000
loopback:
如果为true,单播直接给自己。
组播则同样直接给自己处理,并且之后组播。
当enable_bundling为true并将max_bundle_timeout设置一个足够大的值会体现出差别
缺省:
false
discard_incompatible_packets:
丟弃不同版本的数据包缺省:
false
enable_bundling:
指定是否能够捆绑消息。
如果为真,则累积到max_bundle_size字节,或者max_bundle_time超时。
再将其发出。
缺省:
false
max_bundle_size:
字节数,当消息累积字节数。
当累积值超过该值则消息会被发送。
缺省:
65535
max_bundle_timeout:
消息发送的超时毫秒数。
队列中等待发送的消息超过该时间则被发送.缺省:
20
use_incoming_packet_handler:
当接收消息过载时是否增加新的线程进行处理。
缺省:
true
ip_ttl:
TTL为0,则报文只能本机上使用。
为1则只能在本地网络上使用。
路由器会将其抛弃,标准TTL经过一个路由器,减1,所以不会传递到其它网络。
文档缺省:
32,代码是64
enable_diagnostics:
是否打开内部检测。
(没有找到相关说明,从代码上推测出来的)缺省:
true
thread_naming_pattern:
线程命名方式。
有效值可以是:
pcl.缺省:
cl
p:
之前的名称c:
clusterName聚簇名称l:
localaddress地址
use_concurrent_stack:
是否使用并发栈。
thread_pool:
oob_thread_pool:
use_packet_handler:
-->
ip_mcast="true" mcast_addr="${jgroups.udp.mcast_addr: 228.10.10.10}" mcast_port="${jgroups.udp.mcast_port: 45588}" ucast_recv_buf_size="20000000" ucast_send_buf_size="640000" mcast_recv_buf_size="25000000" mcast_send_buf_size="640000" loopback="false" discard_incompatible_packets="true" enable_bundling="true" max_bundle_size="64000" max_bundle_timeout="3000" use_incoming_packet_handler="true" ip_ttl="${jgroups.udp.ip_ttl: 2}" enable_diagnostics="false" thread_naming_pattern="cl" use_concurrent_stack="true" 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="1000" thread_pool.rejection_policy="Run" 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: 等待初始化成员超时时间(ms)。 缺省: 3000 *property: 为FIND_INITAL_MBRS找到的最小初始化成员数。 缺省: 2 *property: gossip_host-ifyouareusingGOSSIPthenthisdefinesthehostoftheGossipRouter,defaultisnull *property: gossip_port-ifyouareusingGOSSIPthenthisdefinestheportoftheGossipRouter,defaultisnull --> -- 当网络发生故障。 可能将group分隔开。 该协议用于将被分隔开的group进行重新组合 --> -- FD_SOCK: 基于TCP套接字的故障检测。 基于环的ping被在邻居成员之间发送。 --> -- FD(FailureDetection故障检测)heartbeat方式 的作用就是探测组内的成员是否还活着。 当组内的成员被怀疑可能死掉了, 那么SUSPECT消息就会传播到集群的每一个节点上 timeout: 等影响消息的ms数 max_tries: 最大重试次数 shun: 例如: 一个组内有a,b,c,d四个成员, 当d由于负荷过高没有在timeout的时间内作出响应, 导致被踢出组的时候,a,b,c的组员view中只有abc三个member, 而d的view却还有abcd四个成员,此时如果D再发消息给组内的成员, 组内成员将会拒绝接受。 那么如果设置shun为true的时候, D就重新加入组内在下面两种情况: 1.ABC接受到了D发过来的are-you-alive的检测消息。 2.D自己收到了一个view消息,view内不包含D。 (类似于重连机制)。 这点很重要特别是在分布式的环境中,当某些服务器的压力可能较高, 配置的超时时间又不确定是否可以满足高负荷响应。 记得要在GMS里面的shun也配置一样的情况。 --> -- VERIFY_SUSPECT: 发送消息以确保以前怀疑的成员已真正崩溃(crashed) --> -- pbcast.NAKACK: 保证消息的可靠性和顺序性 因为基于底层的UDP协议,数据报不被可靠的传输。 其使用一个NAK的应答保证消息的可靠接收。 使用一个序号保证消息的顺序性 retransmit_timeout: 类似UNICAST的timeout use_mcast_xmit: 是否多播到cluser中 --> exponential_backoff="150" use_mcast_xmit="true"gc_lag="0" retransmit_timeout="50,300,600,1200" discard_delivered_msgs="true"/> -- UNICAST: 实现可靠的单播传输。 请求丢失消息的重新传输,并确保发出消息的正确排序 其通过ACK来进行确认。 第一次超时时间为300ms.第二次为600ms.... --> -- pbcast.STABLE: 删除被全部member查看到的消息 (作用就是如果在分布式的情况下,其中某些member没有看到, 那么这条消息就不会被删除,会重发,保证消息广播的全局性) pbcast.STABLE: 实现分布式的垃圾收集协议(也就是说,删除所有已被所有组成员接收到的消息) --> -- FlowControl流控制服务 用于调用发送端的发送速率和接收端的接收速率达到平衡 --> -- 分块协议: FRAG和FRAG2用来将大消息分块发送 --> --pbcast.STREAMING_STATE_TRANSFER/-->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java语言组播技术 JGroups java 语言 技术