diff --git a/README.MD b/README.MD index eba640ef68e1ee49b5e8219954c1f5a4dc3f6893..5214bd2cf6a8c3850598e5f1d116ade800eef156 100644 --- a/README.MD +++ b/README.MD @@ -14,13 +14,12 @@ ### Apache Dubbo Gateway - +TBD ### é¢˜ç›®ç”±æ¥ ä¼ ç»Ÿçš„è´Ÿè½½å‡è¡¡åœºæ™¯ä¸ºå•è°ƒåº¦å™¨æ¨¡å¼ï¼Œå³ä¸å¿ƒåŒ–è´Ÿè½½å‡è¡¡ï¼šè°ƒåº¦å™¨è´Ÿè´£å°†æ–°åˆ°çš„请求立å³è½¬å‘至多个åŽç«¯æœåŠ¡å™¨ä¸çš„一个。éšç€åˆ†å¸ƒå¼ç³»ç»Ÿçš„å‘展,这ç§å•è°ƒåº¦å™¨æ¨¡å¼åœ¨æ‰©å±•æ€§å’Œå¯é 性方é¢çš„问题也愈å‘严é‡ã€‚å› æ¤ï¼Œè®¾è®¡å’Œå®žçŽ°åŽ»ä¸å¿ƒåŒ–且性能优异的负载å‡è¡¡æ˜¯å¦æœ¯å’Œå·¥ä¸šç•Œçš„å…±åŒéœ€æ±‚。 - ## 赛题说明 按照题目æ供的扩展接å£ï¼Œå®žçŽ°ä¸€å¥—自适应负载å‡è¡¡æœºåˆ¶ã€‚è¦æ±‚能够具备以下能力: @@ -29,9 +28,13 @@ 2. Provider 端能自动进行æœåŠ¡å®¹é‡è¯„估,当请求数é‡è¶…过æœåŠ¡èƒ½åŠ›æ—¶ï¼Œå…许拒ç»éƒ¨åˆ†è¯·æ±‚,以ä¿è¯æœåŠ¡ä¸è¿‡è½½ã€‚ 3. 当请求速率高于所有的 Provider æœåŠ¡æ•ˆçŽ‡ä¹‹å’Œæ—¶ï¼Œå…许 Gateway( Consumer ) æ‹’ç»æœåŠ¡æ–°åˆ°è¯·æ±‚。 - ### 架构 -TBD + + +- Gateway 负责将请求转å‘至 Providerï¼› +- Provider 处ç†è¯·æ±‚返回å“应; +- Provider 按照 CPU æ ¸æ•°å’Œå†…å˜å¤§å°åˆ†ä¸º Smallã€Mediumã€Large ä¸‰ä¸ªè§„æ ¼ï¼› +- 选手需è¦è®¾è®¡å®žçŽ° Gateway 选择 Provider çš„ loadbalance 算法。 ### æœåŠ¡ diff --git a/assets/service-architect.png b/assets/service-architect.png new file mode 100644 index 0000000000000000000000000000000000000000..4df4e033f24d523160ee3c606f6852076e831830 Binary files /dev/null and b/assets/service-architect.png differ diff --git a/pom.xml b/pom.xml index 0542f3ffc77ee11e782af6aed0e8a0e055305675..3055949960681ac3e3bcd1c730158e515d09e184 100644 --- a/pom.xml +++ b/pom.xml @@ -26,5 +26,6 @@ <modules> <module>internal-dubbo</module> <module>internal-gateway</module> + <module>service</module> </modules> </project> \ No newline at end of file diff --git a/service/pom.xml b/service/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..851b0068e6fb533589424f0a8fe83c21ace88823 --- /dev/null +++ b/service/pom.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>adaptive-loadbalance</artifactId> + <groupId>com.aliware.tianchi</groupId> + <version>1.0.0</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>service</artifactId> + <packaging>pom</packaging> + <modules> + <module>service-api</module> + <module>service-consumer</module> + <module>service-provider</module> + </modules> + + <dependencies> + <dependency> + <groupId>com.aliware.tianchi</groupId> + <artifactId>internal-dubbo</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.aliware.tianchi</groupId> + <artifactId>internal-gateway</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/service/service-api/pom.xml b/service/service-api/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..0f3df8723d05524346a21d2d4d7e2c2c317b6733 --- /dev/null +++ b/service/service-api/pom.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>service</artifactId> + <groupId>com.aliware.tianchi</groupId> + <version>1.0.0</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>service-api</artifactId> + + +</project> \ No newline at end of file diff --git a/service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java b/service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..087dfcef54124f5801e2f09ac68d6f1e05aedbe1 --- /dev/null +++ b/service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java @@ -0,0 +1,18 @@ +package com.aliware.tianchi; + +/** + * @author guohaoice@gmail.com + */ +public interface HashInterface { + + /** + * 计算给定å—符串的 hash 值 + * <li> + * <ol>接å£çš„å“应时间符åˆè´ŸæŒ‡æ•°åˆ†å¸ƒ </ol> + * <ol>接å£çš„并å‘度(å…许åŒæ—¶è°ƒç”¨çš„线程数)会éšæ—¶é—´å¢žåŠ 或å‡å°ï¼Œä»Žè€Œæ¨¡æ‹Ÿç”Ÿäº§çŽ¯å¢ƒå¯èƒ½çš„排队</ol> + * </li> + * @param input è¦è®¡ç®—çš„å—符串 + * @return å—符串的 hash 值 + */ + int hash(String input); +} diff --git a/service/service-consumer/pom.xml b/service/service-consumer/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba938d80e9b3c947e8ffdddc82978939cebfd453 --- /dev/null +++ b/service/service-consumer/pom.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>service</artifactId> + <groupId>com.aliware.tianchi</groupId> + <version>1.0.0</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>service-consumer</artifactId> + + +</project> \ No newline at end of file diff --git a/service/service-provider/pom.xml b/service/service-provider/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..53c8fabe88b9307d1fb28c5605161197b9ec82fc --- /dev/null +++ b/service/service-provider/pom.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>service</artifactId> + <groupId>com.aliware.tianchi</groupId> + <version>1.0.0</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>service-provider</artifactId> + + <dependencies> + <dependency> + <groupId>com.aliware.tianchi</groupId> + <artifactId>service-api</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + + +</project> \ No newline at end of file diff --git a/service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java b/service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4df128874254c968a5b484706f4ce0b605223573 --- /dev/null +++ b/service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java @@ -0,0 +1,43 @@ +package com.aliware.tianchi; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * Hash service impl + * + * @author guohaoice@gmail.com + */ +public class HashServiceImpl implements HashInterface { + private long averageRTT; + private int maxConcurrency; + private String salt; + + public HashServiceImpl(long averageRTT, int maxConcurrency, String salt) { + this.averageRTT = averageRTT; + this.maxConcurrency = maxConcurrency; + this.salt = salt; + } + + @Override + public int hash(String input) { + long baseRtt = nextRTT(); + try { + Thread.sleep(baseRtt); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + return (input + salt).hashCode(); + } + + private long nextRTT() { + ThreadLocalRandom rng = ThreadLocalRandom.current(); + double u = rng.nextDouble(); + int x = 0; + double cdf = 0; + while (u >= cdf) { + x++; + cdf = 1 - Math.exp(-1.0 * 1 / averageRTT * x); + } + return x; + } +} diff --git a/service/src/main/java/com/aliware/tianchi/HashInterface.java b/service/src/main/java/com/aliware/tianchi/HashInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..5665174dd7c49ae5760864824d8397a4ea0fd9be --- /dev/null +++ b/service/src/main/java/com/aliware/tianchi/HashInterface.java @@ -0,0 +1,10 @@ +package com.aliware.tianchi; + +/** + * @author guohaoice@gmail.com + */ +public interface HashInterface { + + int hash(String input); + +}