kbmMW均衡负载与容灾(1)(转载红鱼儿)
kbmMW为均衡负载与容灾提供了很好的机制,支持多种实现方式,现在看看最简单的一种,客户端控制的容灾和简单的负载均衡。
现在,我们将kbmMWServer部署到不同的服务器,或者在同一服务器部署多份实例,这样,我们会有一个服务的访问列表:
192.168.0.88:9000
192.168.0.88:9001
192.168.0.89.9000
192.168.0.89.9001
服务准备好了,现在,改造一下客户端的Transport,就可以实现容灾和负载均衡。具体来说,就是利用ClientTransport的两个属性与一个事件:
两个属性:
MaxRetrires:重联次数,触发ClientTransportReconnect事件时,参数Alternative为False
MaxRetriesAlternative:换Transport地址的重联次数,触发ClientTransportReconnect事件时,参数Alternative为True
系统首先按MaxRetries定义的次数试着联接服务,如果都不成功,再按MaxRetriesAlternative定义的次数试着联接服务器,再不
成功,最终触发OnConnectionLost事件。如果你没有处理OnConnectionLost事件,则产生异常Connection
lost。每次重联,都会触发ClientTransportReconnect事
件,在这个事件中,通过参数Alternative可以判断是否需要重新定义Transport服务地址,如果换了新的服务地址,则系统按新地址重联服务
器。假设MaxRetries定义3,MaxRetriesAlternative定义为2,则一共试着重联服务器5次,最后两次,在触发ClientTransportReconnect事件时,Alternative参数为True。
一个事件,这个事件有三个参数:
Sender:Transport对象
Alternative:为True表示应该换一个服务地址
RetriesLeft:剩余的重联次数
下面代码演示了如何利用这个事件更换服务器地址:
procedure
TwpMainModule.kbmMWHTTPSYSClientTransport1Reconnect(Sender:
TObject;
Alternative: Boolean; RetriesLeft:
Integer);
var
i:integer;
const
AltHosts:array [0..5] of string = (
'192.168.0.88:9000',
'192.168.0.88:9001',
'192.168.0.88:9002',
'192.168.0.89:9000',
'192.168.0.89:9001',
'192.168.0.89:9002'
);
begin
if Alternative then
begin
i:=Random(High(AltHosts)-1);
TkbmMWCustomClientTransport(Sender).host:=AltHosts[i];
end;
end;
OK,最简单的均衡负载就这样实现了!
这样处理看起来简单,但存在问题,第一是每个客户端都要知道服务的列表,如果列表变化,不便维护;另外,没有实现真正的均衡,用户有可能都跑到一个服务上。为了解决这些问题,明天计划整理【集中式均衡负载的实现方式】。
参考kbmMW作者的说明文档
kbmMW均衡负载与容灾(1)(转载红鱼儿)的更多相关文章
- kbmMW均衡负载与容灾(3)(转载红鱼儿)
在kbmMW均衡负载与容灾(1)中,介绍了利用ClientTransport的OnReconnect事件,对联接的应用服务器的地址进行更换,做容灾处理.实际上,作者还给我们提供了另外一种机制,直接在C ...
- kbmMW均衡负载与容灾(1)
kbmMW为均衡负载与容灾提供了很好的机制,支持多种实现方式,现在看看最简单的一种,客户端控制的容灾和简单的负载均衡. 现在,我们将kbmMWServer部署到不同的服务器,或者在同一服务器部署多份实 ...
- kbmMW均衡负载与容灾(2)(转载红鱼儿)
集中式均衡负载 为实现集中式均衡负载方案,需要实现两个不同的应用服务器,一个是只包含均衡负载组件再无其他内容的应用服务器,可称之为均衡负载应用服务器,下文简称LB Server,另外一个就是包含一个或 ...
- [转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台
先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号. function CheckSignature(const ...
- [转载红鱼儿]delphi 实现微信开发(1)
大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在u ...
- 清幽傲竹实现的kbmMWServer数据库联接失败重联(转载红鱼儿)
1.修改kbmMWUnidac单元的TkbmMWUNIDACConnection.InternalOpenConnection方法,加上: //支持unidac重联 ...
- [转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件
开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件.对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章. 在xali ...
- [转载红鱼儿]Delphi XE7 update1进步太大了
写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的 ...
- Always on (HA 负载均衡 异地容灾 一体化 )
Sqlserver 2012 开始,以往困扰我们的三个棘手问题:可扩展性.数据保护.异地容灾可以统一通过alwayson 来实现.2014 支持secondary 节点更是达到8个.在硬件调配方面比 ...
随机推荐
- CentOS Find命令
find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录和文件全部进 ...
- Django的restframework的序列化组件之对单条数据的处理
之前我们学习的都是处理书籍或者出版社的所有的数据的方法,下面我们来看下处理单个书籍,或者单个出版社的方法 这个时候我们就需要重新写一个类,这个类的方法,就需要有3个参数,参数1是self,参数2是re ...
- WIN7安装jdk1.7
@官网下载地址 我的64位的 下载后双击,一直下一步就行.出现下面这个关掉就行 新建环境变量 JAVA_HOME C:\Program Files\Java\jdk1.7.0_04 新建环境变量CLA ...
- JAVA EXAM3 复习提纲
[Practice11_Zipcode_ArrayList] Zipcode class: //3 variables: zipcode, city, county, and compare by c ...
- linux命令学习之:cd
cd命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录).另外,~也表 ...
- webpack.dev.conf.js
var utils = require('./utils')var webpack = require('webpack')var config = require('../config') // 一 ...
- golang语言中os/signal包的学习与使用
package main; import ( "os" "os/signal" "fmt" ) //signal包中提供了两个函数 //No ...
- shell 脚本编写基础
在进行Linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行 ...
- mybatis进阶--输入映射和输出映射
我们知道,mapper.xml是我们配置操作数据库的sql语句的地方.其中每个sql语句对应着一个方法,每个方法都有自己的输入输出参数类型.那么这些类型都是怎么配置的呢?今天我们来一起学习下. 输入映 ...
- 用MySQL的朋友们请不要使用"utf8",请使用"utf8mb4"
转自: (译)用MySQL的朋友们请不要使用"utf8",请使用"utf8mb4" 用MySQL的朋友们请不要使用"utf8",请使用 ...