Skip to content

Commit 74e7066

Browse files
committed
upload the final submission (07/05 11:28)
0 parents  commit 74e7066

File tree

16 files changed

+2011
-0
lines changed

16 files changed

+2011
-0
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.idea/
2+
target/
3+
data*
4+
*.iml
5+
*.jar
6+
*tmp*
7+
*PlayGround.java

README.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
## Disclaimer
2+
3+
此项目仅供学习与交流使用,请遵循MIT协议,如果您在任何项目中使用相关代码,请保留此项目的LICENSE文件。
4+
5+
>写在前面:
6+
> 1. 在开始coding前请仔细阅读以下内容
7+
8+
这个是Java Demo, C++ Demo 请查看[链接](https://code.aliyun.com/middlewarerace2018/queue-race-2018-cpp)
9+
提交的时候,代码地址只需要写":"后面的内容,也即省去"git@code.aliyun.com"。
10+
CPP的提交,请在镜像地址里写"CPP",Java的无需填写。
11+
用户名和密码可以不用填写。
12+
13+
```
14+
-Xms1G -Xmx1G -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails
15+
```
16+
17+
18+
## 1. 题目背景
19+
Apache RocketMQ作为的一款分布式的消息中间件,历年双十一承载了万亿级的消息流转,为业务方提供高性能低延迟的稳定可靠的消息服务。随着业务的逐步发展和云上的输出,单机队列数量的逐步增加,给RocketMQ带来了新的挑战。复赛的题目要求设计一个单机百万队列以上的存储引擎,单机内存有限,需要充分利用数据结构与存储技术,最大化吞吐量。
20+
21+
## 2. 题目描述
22+
23+
### 2.1 题目内容
24+
实现一个进程内的队列引擎,单机可支持100万队列以上。
25+
26+
27+
### 2.2 语言限定
28+
JAVA和C++
29+
30+
31+
注意:
32+
Java和C++一起参与排名。
33+
C++的Demo还在制作中(预计两天后可以出来),其核心逻辑与Java是一致的。选手们可以参考Java先行开始代码编写。
34+
35+
36+
## 3. 程序目标
37+
38+
仔细阅读demo项目中的QueueStore,DefaultQueueStoreImpl,DemoTester三个类。
39+
40+
你的coding目标是重写DefaultQueueStoreImpl,并实现以下接口:
41+
abstract void put(String queueName, String message);
42+
abstract Collection<String> get(String queueName, long offset, long num);
43+
44+
注:
45+
评测时的数据存储路径为:/alidata1/race2018/data。
46+
日志请直接打印在控制台标准输出,可以使用System.out.println,如果使用日志框架,请配置为ConsoleAppender。注意不要把日志输出到Error通道(也即不要使用System.err.println,如果使用日志框架,则不要使用log.error)。评测程序会把控制台标准输出的内容搜集出来,放置在OSS上面供用户排错,但是请不要密集打印日志,单次评测,最多不能超过100M。
47+
日志下载路径为:http://race2018.oss-cn-beijing.aliyuncs.com/{teamcode}.logs.tgz,只保存最近一次任务的日志。
48+
49+
50+
## 4.参赛方法说明
51+
1. 在阿里天池找到"中间件性能挑战赛",并报名参加
52+
2. 在code.aliyun.com注册一个账号,并新建一个仓库名,并将大赛官方账号middlewarerace2018添加为项目成员,权限为reporter
53+
3. fork或者拷贝本仓库的代码到自己的仓库,并实现自己的逻辑
54+
4. 在天池提交成绩的入口,提交自己的仓库git地址,等待评测结果
55+
5. 坐等每天10点排名更新
56+
57+
58+
## 4. 测试环境描述
59+
测试环境为4c8g的ECS,限定使用的最大JVM大小为4GB(-Xmx4g)。带一块300G左右大小的SSD磁盘。
60+
61+
SSD性能大致如下:
62+
iops 1w 左右;块读写能力(一次读写4K以上) 在200MB/s 左右。
63+
64+
ulimit -a:
65+
66+
```
67+
core file size (blocks, -c) 0
68+
data seg size (kbytes, -d) unlimited
69+
scheduling priority (-e) 0
70+
file size (blocks, -f) unlimited
71+
pending signals (-i) 31404
72+
max locked memory (kbytes, -l) 64
73+
max memory size (kbytes, -m) unlimited
74+
open files (-n) 6553560
75+
pipe size (512 bytes, -p) 8
76+
POSIX message queues (bytes, -q) 819200
77+
real-time priority (-r) 0
78+
stack size (kbytes, -s) 10240
79+
cpu time (seconds, -t) unlimited
80+
max user processes (-u) 31404
81+
virtual memory (kbytes, -v) unlimited
82+
file locks (-x) unlimited
83+
```
84+
磁盘调度算法是 deadline
85+
其它系统参数都是默认的。
86+
87+
## 5. 程序校验逻辑
88+
89+
校验程序分为三个阶段:
90+
1.发送阶段
91+
2.索引校验阶段
92+
3.顺序消费阶段
93+
请详细阅读DemoTester以理解评测程序的逻辑。
94+
95+
### 5.1. 程序校验规模说明
96+
1.各个阶段线程数在20~30左右
97+
2.发送阶段:消息大小在50字节左右,消息条数在20亿条左右,也即发送总数据在100G左右
98+
3.索引校验阶段:会对所有队列的索引进行随机校验;平均每个队列会校验1~2次;
99+
4.顺序消费阶段:挑选20%的队列进行全部读取和校验;
100+
5.发送阶段最大耗时不能超过1800s;索引校验阶段和顺序消费阶段加在一起,最大耗时也不能超过1800s;超时会被判断为评测失败。
101+
102+
## 6. 排名规则
103+
104+
在结果校验100%正确的前提下,按照平均tps从高到低来排名
105+
106+
107+
## 7. 第二/三方库规约
108+
109+
* 仅允许依赖JavaSE 8 包含的lib
110+
* 可以参考别人的实现,拷贝少量的代码
111+
* 我们会对排名靠前的代码进行review,如果发现大量拷贝别人的代码,将扣分
112+
113+
## 8.作弊说明
114+
115+
所有消息都应该进行按实际发送的信息进行存储,可以压缩,但不能伪造。
116+
如果发现有作弊行为,比如通过hack评测程序,绕过了必须的评测逻辑,则程序无效,且取消参赛资格。
117+
118+

pom.xml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>io.openmessaging</groupId>
8+
<artifactId>race2018</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
11+
12+
<dependencies>
13+
<dependency>
14+
<groupId>org.slf4j</groupId>
15+
<artifactId>slf4j-log4j12</artifactId>
16+
<version>1.7.6</version>
17+
</dependency>
18+
</dependencies>
19+
20+
<build>
21+
<plugins>
22+
<plugin>
23+
<artifactId>maven-compiler-plugin</artifactId>
24+
<version>2.3.2</version>
25+
<configuration>
26+
<source>1.8</source>
27+
<target>1.8</target>
28+
<encoding>utf-8</encoding>
29+
</configuration>
30+
</plugin>
31+
<plugin>
32+
<artifactId>maven-assembly-plugin</artifactId>
33+
<version>2.2.1</version>
34+
<dependencies>
35+
<dependency>
36+
<groupId>org.apache.maven</groupId>
37+
<artifactId>maven-core</artifactId>
38+
<version>2.2.1</version>
39+
</dependency>
40+
</dependencies>
41+
<configuration>
42+
<finalName>Race2018</finalName>
43+
<appendAssemblyId>false</appendAssemblyId>
44+
<descriptors>
45+
<descriptor>src/main/resources/package.xml</descriptor>
46+
</descriptors>
47+
</configuration>
48+
<executions>
49+
<execution>
50+
<id>make-assembly</id>
51+
<phase>package</phase>
52+
<goals>
53+
<goal>single</goal>
54+
</goals>
55+
</execution>
56+
</executions>
57+
</plugin>
58+
</plugins>
59+
</build>
60+
61+
</project>

0 commit comments

Comments
 (0)