当前位置:编程学习 > JAVA >>

IceStorm 是否支持负载均衡

ice版本:3.5
第一个问题: 在3.5这个版本中IceStorm 是否支持负载均衡策略?因为目前在我们的项目中,每一个客户端是信息的发布者,服务器是订阅者,相当于把IceStorm倒过来用了,IceStorm部署的是一个信息发布者,多个订阅者。
第二个问题: 如果支持, 我做了一个例子,参考了IceGrid 部署IceStorm 的C++的配置文件,这个配置文件(demo/IceStorm/replicated)是ice安装之后自带的一个例子。
我用了两台物理机作为两个节点,
注册器和节点1在主机192.168.1.144上,配置文件如下:
IceGrid.InstanceName=DemoIceGrid

Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.1.144 -p 4061

IceGrid.Registry.Client.Endpoints=default -h 192.168.1.144 -p 4061
IceGrid.Registry.Server.Endpoints=default -h 192.168.1.144  
IceGrid.Registry.Internal.Endpoints=default -h 192.168.1.144 
IceGrid.Registry.Data=C:\IceGrid\registry1
IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier

IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=default -h 192.168.1.144 
IceGrid.Node.Data=C:\IceGrid\node1
IceGrid.Node.CollocateRegistry=1

# Trace properties.
IceGrid.Node.Trace.Activator=3
IceGrid.Node.Trace.Adapter=3
IceGrid.Node.Trace.Replica=3
IceGrid.Node.Trace.Server=3
IceGrid.Registry.Trace.Adapter=1
IceGrid.Registry.Trace.Node=2

#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar

服务器部署文件内容:
<icegrid>
<application name="DemoIceStorm">
<server-template id="IceStorm">
<parameter name="index" />
<parameter name="topic-manager-endpoints" default="default -h localhost" />
<parameter name="publish-endpoints" default="default -h localhost" />
<parameter name="node-endpoints" default="default -h localhost" />
<parameter name="instance-name" />
<icebox id="${instance-name}-${index}" exe="icebox"
activation="on-demand">
<service name="IceStorm" entry="IceStormService,35:createIceStorm">
<dbenv name="${service}" />
<adapter name="${service}.TopicManager" endpoints="${topic-manager-endpoints}"
replica-group="${instance-name}-TopicManagerReplicaGroup" />
<adapter name="${service}.Publish" endpoints="${publish-endpoints}"
replica-group="${instance-name}-PublishReplicaGroup" />
<adapter name="${service}.Node" endpoints="${node-endpoints}" />
<properties>
<property name="${service}.InstanceName" value="${instance-name}" />
<property name="${service}.Trace.TopicManager" value="2" />
<property name="${service}.Trace.Topic" value="1" />
<property name="${service}.Trace.Subscriber" value="1" />
<property name="${service}.NodeId" value="${index}" />
</properties>
</service>
</icebox>
</server-template>
<replica-group id="DemoIceStorm-PublishReplicaGroup">
</replica-group>
<replica-group id="DemoIceStorm-TopicManagerReplicaGroup">
<load-balancing type="round-robin" />
<object identity="DemoIceStorm/TopicManager" type="IceStorm.TopicManager" />
</replica-group>
<node name="node1">
<server-instance template="IceStorm" index="1"
instance-name="DemoIceStorm" />
<server-instance template="IceStorm" index="2"
instance-name="DemoIceStorm" />
<server-instance template="IceStorm" index="3"
instance-name="DemoIceStorm" />
</node>
<node name="node2">
<server-instance template="IceStorm" index="4"
instance-name="DemoIceStorm" />
<server-instance template="IceStorm" index="5"
instance-name="DemoIceStorm" />
<server-instance template="IceStorm" index="6"
instance-name="DemoIceStorm" />
</node>
</application>
</icegrid>

节点2部署在192.168.1.155上
节点2的配置文件如下: 
#The IceGrid locator proxy. 
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.144 -p 4061

#IceGrid node configuration
IceGrid.Node.Name=node2
IceGrid.Node.Endpoints=default -h 192.168.1.155
IceGrid.Node.Data=C:\IceGrid\node2
IceGrid.Node.CollocateRegistry=0 

# Trace properties.
IceGrid.Node.Trace.Activator=3
IceGrid.Node.Trace.Adapter=3
IceGrid.Node.Trace.Replica=3
IceGrid.Node.Trace.Server=3
IceGrid.Registry.Trace.Adapter=1
IceGrid.Registry.Trace.Node=2
#Ice.Trace.Network=3
#Ice.Trace.Protocol=3
#Ice.Trace.Locator=3
#Ice.Trace.Retry=2
#Ice.LogFile=c:\IceGrid\log.txt


启动节点和部署应用之后,执行订阅端程序,
订阅端的java代码如下:
import IceStorm.AlreadySubscribed;
import IceStorm.BadQoS;
import iceGridAndIceBoxAndIceStorm.servant.MonitorI;
import publisherAndSubscribe.Monitor;

public class Subscriber extends Ice.Application {

public int run(String[] args) {
Ice.ObjectPrx obj = communicator().stringToProxy("DemoIceStorm/TopicManager");
IceStorm.TopicManagerPrx topicManager = IceStorm.TopicManagerPrxHelper
.checkedCast(obj);
System.out.println("topicManager = "+topicManager);
Ice.ObjectAdapter adapter = communicator().createObjectAdapter("WeatherMonitorAdapter");
Monitor monitor1 = new MonitorI("the first monitor");
Ice.ObjectPrx proxy1 = adapter.addWithUUID(monitor1).ice_oneway();
adapter.activate();
IceStorm.TopicPrx topic = null;
try {
topic = topicManager.retrieve("Weather");
} catch (IceStorm.NoSuchTopic ex) {
try
            {
                topic = topicManager.create("Weather");
            }
            catch(IceStorm.TopicExists it)
            {
                System.err.println("temporary failure, try again.");
            }
}
java.util.Map qos = null;
try {
topic.subscribeAndGetPublisher(qos, proxy1);
} catch (AlreadySubscribed e) {
e.printStackTrace();
} catch (BadQoS e) {
e.printStackTrace();
}
communicator().waitForShutdown();
topic.unsubscribe(proxy1);
return 0;
}

public static void main(String[] args) {
Subscriber app = new Subscriber();
System.exit(app.main("Server", args,"C:\\config.sub"));
}
}


当程序执行到topic = topicManager.retrieve("Weather")这里去检索主题的时候,好像线程已经被挂起。
终端显示日志如下:
topicManager = DemoIceStorm/TopicManager -t -e 1.1
-- 13-8-13 10:21:10:437 Server: Network: attempting to bind to tcp socket 192.168.1.144:0
-- 13-8-13 10:21:10:437 Server: Network: listening for tcp connections at 192.168.1.144:3732
-- 13-8-13 10:21:10:453 Server: Network: published endpoints for object adapter `WeatherMonitorAdapter':
   tcp -h 192.168.1.144 -p 3732
-- 13-8-13 10:21:10:593 Server: Network: accepting tcp connections at 192.168.1.144:3732
-- 13-8-13 10:21:10:593 Server: Protocol: sending request 
   message type = 0 (request)
   compression status = 0 (not compressed; do not compress response, if any)
   message size = 70
   request id = 2
   identity = DemoIceStorm/TopicManager
   facet = 
   operation = retrieve
   mode = 1 (nonmutating)
   context = 
   encoding = 1.1
-- 13-8-13 10:21:10:593 Server: Network: sent 70 of 70 bytes via tcp
   local address = 127.0.0.1:3728
   remote address = 127.0.0.1:3709
-- 13-8-13 10:22:10:765 Server: Network: received 14 of 14 bytes via tcp
   local address = 192.168.1.144:3704
   remote address = 192.168.1.144:4061
-- 13-8-13 10:22:10:765 Server: Protocol: received close connection 
   message type = 4 (close connection)
   compression status = 1 (not compressed; compress response, if any)
   message size = 14
-- 13-8-13 10:22:10:765 Server: Network: closing tcp connection
   local address = 192.168.1.144:3704
   remote address = 192.168.1.144:4061


程序一直停留在检索主题的地方,请问哪个地方配置有问题吗? icestorm 负载均衡 中间件 分布式部署 java
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,