ARTS-第三周

耗子叔发起的ARTS计划,第三周。
ARTS计划简介:

https://time.geekbang.org/column/article/85839?from=singlemessage

A

上周选取的topN算法,没有写具体实现,这周学习了一下堆排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public String frequencySort(String s) {
java.lang.String line = "hello world";
char[] lines = line.toCharArray();
sort(lines);
String newLine = new String(lines);
System.out.println();
return newLine;
}


public void sort(char[] arry) {
//创建大根堆
createTop(arry);
//交换元素
for (int i = arry.length - 1; i > 0; i--) {
swap(arry, 0, i);
adjustHeap(arry, 0, i);
}

}

/**
* 交换元素
*
* @param arry
* @param i
* @param i1
*/
private void swap(char[] arry, int i, int i1) {
char temp = arry[i1];
arry[i1] = arry[i];
arry[i] = temp;
}

/**
* 创建大根堆
*
* @param arry
*/
public void createTop(char[] arry) {

int length = arry.length;
for (int i = (length - 1) / 2; i >= 0; i--) {
//调整
adjustHeap(arry, i, length);
}
}

/**
* 调整大根堆
*
* @param arry
* @param i
* @param length
*/
private void adjustHeap(char[] arry, int i, int length) {
char temp = arry[i];
//从i结点的左子结点开始,也就是2i+1处开始
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
//如果左子结点小于右子结点,k指向右子结点
if (k + 1 < length && arry[k] > arry[k + 1]) { //这里改成大于号
k++;
}
//如果子节点大于父节点,将子节点值赋给父节点
if (arry[k] < temp) { //这里改成小于号 和上面的一起改,就变成了小根堆。。。
arry[i] = arry[k];
i = k;
} else {
break;
}
}
arry[i] = temp;
}

R

这周的R没有选取Sentinel,而是选取了logstash,因为接下来要做的一个项目要用到logstash的功能,这周暂时替换一下。

地址为:

https://github.com/elastic/logstash

logstash是Elastic Stack中的一员。主要负责服务端的数据处理管道,它可以同时接收多方的数据,根据一些规则转换完之后传输到我们想要传输的地方去。例如:Elasticsearch,kafka等。
官方阅读文档地址:

https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html

logstash插件地址:

https://github.com/logstash-pluginslanguage=&page=5&q=&type=&utf8=%E2%9C%93

logstash下载地址:

https://www.elastic.co/cn/downloads/logstash

注意:
logstash的解压路径中不要包含 : 符号。

logstash简单用法

logstash包含两个必要的元素:inputoutput,和一个非必要的元素: filter

元素 功能
input 从一个源头消费消息
output 将数据输出到我们指定的位置
filter 将数据处理成我们需要的格式

一个最简单的命令来测试我们安装的logstash:

1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e的命令可以让我们快速的通过命令行来指定输入和输出,不需要反复修改文件,以达到快速测试的目的。

当屏幕上显示: Pipeline main started之后,我们在屏幕上输入2 会显示这样的结果:

1
2
3
4
5
6
{
"@timestamp" => 2019-04-14T12:15:09.879Z,
"message" => "2",
"host" => "xyj",
"@version" => "1"
}

T

countdownlatch.await()
countdownlatch.countdown()
可以实现类似通知的功能,具体原理下周会仔细研究AQS并做笔记。

S

截止目前,我已经学习了很多技术,包括消息队列,logstash,Redis, Sharding-Jdbc,Elasticsearch, zipkin, hadoop生态圈。但是都只限于学,以至于很多时候在学习完之后不久就忘掉了。为了解决这个问题,我决定用当前所学习的知识去搭建一套消息监控系统,在复习自己的知识的同时,也给同事带来一点便捷。

地址为:

http://www.xunyajie.com/2019/04/14/%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F-%E4%B8%80-%E8%AE%BE%E8%AE%A1/