# 阿里巴巴2019中间件性能挑战赛-自适应负载均衡(初赛)赛题
## 背景
### 负载均衡 (loadbalance)
[负载均衡](https://en.wikipedia.org/wiki/Load_balancing_(computing))是大规模计算机系统中的一个基础问题。灵活的负载均衡算法可以将请求合理地分配到负载较少的服务器上。理想状态下,负载均衡算法应该能够最小化服务响应时间(RTT),使系统吞吐量最高,从而保持高性能服务能力。自适应负载均衡是指负载均衡算法能够根据服务能力动态的进行流量调度,无论当系统处在空闲、稳定还是繁忙状态,系统都可以保持较好的性能,不会产生饥饿或者宕机。
### Apache Dubbo (incubating)
[Apache Dubbo (incubating)](http://dubbo.apache.org/zh-cn/) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
![dubbo_architect](assets/dubbo_architecture.png)
### 题目由来
传统的负载均衡场景为单调度器模式,即中心化负载均衡:调度器负责将新到的请求立即转发至多个后端服务器中的一个。随着分布式系统的发展,这种单调度器模式在扩展性、可靠性和性能方面的问题愈发严重。因此,设计和实现去中心化且性能优异的负载均衡是学术和工业界的共同需求。
## 赛题说明
基于题目提供的 Dubbo LoadBalance 接口,实现一套自适应负载均衡机制,作为扩展作用于 gateway 和 provider两端。要求能够具备以下能力:
1. Gateway(Consumer) 端能够自动根据服务处理能力变化动态最优化分配请求保证较低响应时间,较高吞吐量。
2. Provider 端能自动进行服务容量评估,当请求数量超过服务能力时,允许拒绝部分请求,以保证服务不过载。
3. 当请求速率高于所有的 Provider 服务效率之和时,允许 Gateway( Consumer ) 拒绝服务新到请求。
### 架构
![service_architect](assets/service-architect.png)
- 所有程序均在不同的 docker 容器中运行,每个容器都独占运行在不同的物理机上:
- Gateway 负责将请求转发至 Provider;
- Provider 处理请求返回响应;
- Provider 按照 CPU 核数和内存大小分为 Small、Medium、Large 三个规格;
- 选手需要设计实现 Gateway 选择 Provider 的 load balance 算法。
### 目标
1. 保证系统稳定性,任何情况下服务都不能被打挂;
2. 保证请求成功率,尽可能的让更多的请求在较短的时间内被处理;
3. 尽可能避免因重试导致流量被过度放大。
4. 为降低难度,本次比赛题目只使用了一个 Consumer。但负载均衡算法应该是可扩展的,需要考虑多 Consumer 和多 Provider 的情况。
### 服务
Provider 是服务提供者,Gateway( Consumer ) 是服务消费者,Gateway 消费 Provider 提供的服务。Gateway 及 Provider 服务的实现 **由赛会官方提供**。 为简化流程,本次比赛不使用服务注册和发现机制,Gateway 通过 docker 的 dns 直连调用 Provider 服务。
Provider 服务接口:
```java
public interface HashInterface {
/**
* 计算给定字符串的 hash 值
* <li>
* <ol>接口的响应时间符合负指数分布 </ol>
* <ol>接口的并发度(允许同时调用的线程数)会随时间增加或减小,从而模拟生产环境可能的排队</ol>
* </li>
* @param input 要计算的字符串
* @return 字符串的 hash 值
*/
int hash(String input);
}
```
Consumer 在接收到客户端请求以后,会生成一个随机字符串,然后根据负载均衡算法选择一个 Provider 。 由 Provider 计算哈希值后返回,客户端会校验该哈希值与其生成的数据是否相同,如果相同则返回正常(200),否则返回异常(500)。
### 启动和调用流程
1. 启动三个 Provider 实例
2. 启动 Gateway 实例
3. 客户端通过 HTTP 访问 Gateway 服务
4. Gateway 按照选手扩展的路由或负载均衡算法选择一个 Provider 并进行调用
5. Provider 处理请求,返回结果
6. Gateway 将本次请求的结果返回至客户端(success/failure)
### 项目结构
- internal-dubbo dubbo 依赖,不允许修改,评测时不依赖选手编译的 jar 包;
- 此次比赛的 Dubbo 版本是私有版本,具备开源 Dubbo 没有的一些扩展接口,选手需要下载源码,本地构建,不应该依赖远程仓库拉取依赖
- internal-service 服务的接口定义和实现,不允许修改,评测时不依赖选手编译的 jar 包;
- 包含了服务端和客户端,服务端包含了负载动态变化的逻辑,开放给选手自己本地测试,禁止选手设计一个负载均衡算法来 hack 变化的过程;选手可以本地启动服务端客户端示例进行本地测试
- adaptive-loadbalance(workspace) 选手进行开发的模块, 评测时会以 jar 包依赖的方式加载。
- 在选手本地开发阶段时,可以直接在 internal-service 的相应模块声明该 maven 依赖
### 开发接口
### com.aliware.tianchi.UserLoadBalance
**负载均衡接口**,用户需要更改该接口的实现,在示例代码中,实现了一个随机负载均衡算法
```java
public class UserLoadBalance implements LoadBalance {
@Override
public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
return invokers.get(ThreadLocalRandom.current().nextInt(invokers.size()));
}
}
```
### 辅助接口
### org.apache.dubbo.rpc.listener.CallbackListener
```java
@SPI
public interface CallbackListener {
void receiveServerMsg(String msg);
}
```
客户端扩展接口,用于接收服务端的推送。
**接口实现示例**
```java
public class CallbackListenerImpl implements CallbackListener {
@Override
public void receiveServerMsg(String msg) {
System.out.println("receive msg from server :" + msg);
}
}
```
**添加 SPI 声明文件**
resources/META-INF/services/org.apache.dubbo.rpc.listener.CallbackListener
```
com.aliware.tianchi.CallbackListenerImpl
```
### org.apache.dubbo.rpc.service.CallbackService
```java
@SPI
public interface CallbackService {
void addListener(String key, CallbackListener listener);
}
```
服务端扩展接口,用于接收客户端 CallbackListener 的注册,并执行推送能力。
**接口实现示例**
```java
public class CallbackServiceImpl implements CallbackService {
public CallbackServiceImpl() {
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!listeners.isEmpty()) {
for (Map.Entry<String, CallbackListener> entry : listeners.entrySet()) {
try {
entry.getValue().receiveServerMsg(new Date().toString());
} catch (Throwable t1) {
listeners.remove(entry.getKey());
}
}
}
}
}, 0, 5000);
}
private Timer timer = new Timer();
/**
* key: listener type
* value: callback listener
*/
private final Map<String, CallbackListener> listeners = new ConcurrentHashMap<>();
@Override
public void addListener(String key, CallbackListener listener) {
listeners.put(key, listener);
listener.receiveServerMsg(new Date().toString()); // send notification for change
}
}
```
由于客户端可以实现多个 CallbackListener 实例,故在示例中使用 `Map<String, CallbackListener>` 维护关联。
**添加 SPI 声明文件**
resources/META-INF/services/org.apache.dubbo.rpc.service.CallbackService
```
com.aliware.tianchi.CallbackServiceImpl
```
> 以上 CallbackListener 和 Call
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的竞赛项目学习资料,作为参考学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 阿里中间件2019(源码+项目说明)(14名).zip
资源推荐
资源详情
资源评论
收起资源包目录
阿里中间件2019(源码+项目说明)(14名).zip (44个子文件)
code_20105
aliMiddlewareRace2019_part1
workspace-provider
pom.xml 710B
src
main
resources
META-INF
services
org.apache.dubbo.remoting.transport.RequestLimiter 38B
org.apache.dubbo.rpc.Filter 36B
org.apache.dubbo.rpc.service.CallbackService 39B
java
com
aliware
tianchi
CallbackServiceImpl.java 2KB
TestServerFilter.java 2KB
TestRequestLimiter.java 9KB
pom.xml 3KB
assets
service-architect.png 16KB
dubbo_architecture.png 15KB
benchmark_architect.png 14KB
workspace-gateway
pom.xml 709B
src
main
resources
META-INF
services
org.apache.dubbo.rpc.listener.CallbackListener 40B
org.apache.dubbo.rpc.cluster.LoadBalance 35B
org.apache.dubbo.rpc.Filter 36B
java
com
aliware
tianchi
CallbackListenerImpl.java 1KB
UserLoadBalance.java 3KB
TestClientFilter.java 1KB
README.MD 17KB
workspace-common
pom.xml 694B
FAQ.md 3KB
aliMiddlewareRace2019_part2
pom.xml 2KB
src
test
java
io
openmessaging
DemoTester.java 17KB
DemoTester2.java 7KB
main
resources
package.xml 759B
java
io
openmessaging
Message.java 1KB
DefaultMessageStoreImpl.java 55KB
MessageStore.java 2KB
target
classes
package.xml 759B
io
openmessaging
DefaultMessageStoreImpl.class 15KB
Message.class 2KB
MessageStore.class 492B
WTHread.class 2KB
test-classes
io
openmessaging
DemoTester$Producer.class 2KB
DemoTester$MessageChecker.class 4KB
DemoTester$ValueChecker.class 3KB
DemoTester2$ValueChecker.class 2KB
DemoTester.class 4KB
DemoTester2$MessageChecker.class 2KB
DemoTester2.class 3KB
DemoTester2$Producer.class 1KB
race2019.iml 1KB
README.md 6KB
README.md 154B
共 44 条
- 1
资源评论
土豆片片
- 粉丝: 1567
- 资源: 5642
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功