我正在为我的应用程序(两个系统集成)使用protobuf rpc pro。protobuf rpc pro基于Netty并使用Netty的这种依赖关系:
我需要为两个系统之间的通信实现通道池,以获得高性能。一、 在我的实现中,我希望获得多个连接,这些连接将并行发送消息(非阻塞通信)。这里的问题是,我如何检查发送缓冲区是否已满,并切换到另一个连接(如负载平衡)。在Netty或某些外部实现中是否有任何机制?在网上没有找到任何东西。。。
你看过通道isWritable()方法了吗?据我所知,如果写缓冲区太满,则返回false。
编辑:添加了一个使用通道#isWriteable()和高水印/低水印的简单演示。
static InetSocketAddress ADDRESS = new InetSocketAddress("localhost", 4711);
static ChannelPipeline createPipeline() {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(100,
Delimiters.lineDelimiter()));
pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));
pipeline.addLast("stringEncoder", new StringEncoder(CharsetUtil.UTF_8));
return pipeline;
}
public static void main(String[] args) throws Throwable {
int suspendedWrites = 0;
int N = 1000;
final CountDownLatch ready = new CountDownLatch(N);
ConnectionlessBootstrap server = new ConnectionlessBootstrap(
new NioDatagramChannelFactory());
server.setPipeline(createPipeline());
server.getPipeline().addLast("printer",
new SimpleChannelUpstreamHandler() {
@Override
public void messageReceived(ChannelHandlerContext ctx,
MessageEvent e) throws Exception {
System.out.println((String) e.getMessage());
ready.countDown();
}
});
server.bind(ADDRESS);
ClientBootstrap client = new ClientBootstrap(
new NioDatagramChannelFactory());
client.setPipeline(createPipeline());
Channel clientChannel = client.connect(ADDRESS).sync().getChannel();
NioDatagramChannelConfig config = (NioDatagramChannelConfig) clientChannel
.getConfig();
config.setWriteBufferLowWaterMark(500);
config.setWriteBufferHighWaterMark(1000);
for (int i = 0; i < N; ++i) {
String message = "Hello number " + (i + 1) + " from client\n";
if (clientChannel.isWritable())
clientChannel.write(message);
else {
clientChannel.write(message).await();
++suspendedWrites;
}
}
ready.await(1, TimeUnit.SECONDS);
client.releaseExternalResources();
client.shutdown();
server.releaseExternalResources();
server.shutdown();
System.out.println("Suspended writes: " + suspendedWrites);
System.out.println("Missed reads: " + ready.getCount());
}
运行此选项将显示通道#isWriteable()取决于当前写入缓冲区大小以及高水位线和低水位线的值。
更详细的实现可以监控兴趣操作的变化,并在此基础上提供可写通道。
负载均衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载均衡服务通常是由专用软体和硬件来完成。 负载均衡最重要的一个应用是利用多台服务器提供单一服务,这种方案有
负载均衡包括负载均衡实例、访问控制及证书。 实例 负载均衡实例是一个运行的负载均衡服务,通过设置的虚拟IP接收流量并将其转发分配给后端服务器。 访问控制 访问控制用于设置访问负载均衡的IP白名单或IP黑名单。 证书 当在负载均衡实例上配置HTTPS监听转发来自HTTPS协议的请求时,需要配置证书。
一个简单的负载均衡的示例,把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。> http { : upstream myproject { : server 127.0.0.1:8000 weight=3; : server 127.0.0.1:8001; : server 127.0.0.1:8002; : server 127.0.0.1:8003; : }
SOFARPC 提供多种负载均衡算法,目前支持以下五种: 类型 名称 描述 random 随机算法 默认负载均衡算法。 localPref 本地优先算法 优先发现是否本机发布了该服务,如果没有再采用随机算法。 roundRobin 轮询算法 方法级别的轮询,各个方法间各自轮询,互不影响。 consistentHash 一致性hash算法 同样的方法级别的请求会路由到同样的节点。 weightRou
本节将会讨论常见的分布式系统负载均衡手段。 6.5.1 常见的负载均衡思路 如果我们不考虑均衡的话,现在有n个服务节点,我们完成业务流程实际上只需要从这n个中挑出其中的一个。有几种思路: 按顺序挑: 例如上次选了第一台,那么这次就选第二台,下次第三台,如果已经到了最后一台,那么下一次从第一台开始。这种情况下我们可以把服务节点信息都存储在数组中,每次请求完成下游之后,将一个索引后移即可。在移到尽头时
当过滤器需要获取到上游群集中的主机连接时,群集管理器使用负载平衡策略来确定选择哪个主机。负载平衡策略是可插入的,并且在配置中以每个上游集群为单位进行指定。请注意,如果没有为群集配置积极的健康检查策略,则所有上游群集成员都被视为健康。 支持的负载平衡策略 轮训 这是一个简单的策略,每个健康的上游主机按循环顺序选择。 权重最小请求 请求最少的负载均衡器使用O(1)算法来选择两个随机的健康主机,并选择活