流量統(tǒng)計(jì)是監(jiān)控系統(tǒng)中非常重要的一部分崭倘,用來計(jì)算單位時(shí)間內(nèi)通過的平均流量迅栅。本例簡(jiǎn)單用代碼模擬了流量請(qǐng)求的模式捎谨,采用單獨(dú)一個(gè)檢測(cè)線程曼库,里面實(shí)現(xiàn)了一個(gè)方法watch(int byteSize)
慈省,用來統(tǒng)計(jì)通過的流量臀防,內(nèi)部采用一個(gè)原子類計(jì)數(shù)相加,另外在階段定時(shí)統(tǒng)計(jì)完成后進(jìn)行清零操作边败,重新開始累計(jì)袱衷。此例子不僅限于流量統(tǒng)計(jì),其他類似場(chǎng)景也可以使用笑窜,比如訪問量致燥,活躍數(shù)等,是一個(gè)簡(jiǎn)單的模型排截。實(shí)現(xiàn)一般嫌蚤,有改進(jìn)空間。以下是代碼:
package com.igoso.learning;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by igoso on 18-3-6.
*/
public class SimpleFlowTest {
public static void main(String[] args) {
final Watcher watcher = new Watcher("watcher", 5);
watcher.start();
int maxByteSize = 10000;
final Thread[] producers = new Thread[5];
for (int i = 0; i < 5; i++) {
producers[i] = new Producer(watcher, "producer-" + i, maxByteSize);
producers[i].start();
}
}
}
class Producer extends Thread {
private Watcher watcher = null;
private int maxByteSize = 10000;
private long count = 0;
public Producer(final Watcher watcher, String name, int maxByteSize) {
this.watcher = watcher;
this.setName(name);
this.maxByteSize = maxByteSize;
}
@Override
public void run() {
for (; ; ) {
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
int byteSize = produce();
watcher.watch(byteSize);
}
}
/**
* 模擬每個(gè)數(shù)據(jù)包的大小
*
* @return
*/
private int produce() {
int size = new Random().nextInt(maxByteSize) + 1;
if (count + size >= Long.MAX_VALUE) {
count = 0;
} else {
count += size;
}
return size;
}
}
class Watcher extends Thread {
final private AtomicInteger increment = new AtomicInteger(0);
private int period = 5;
public Watcher(String name, int period) {
this.setName(name);
this.period = period;
}
public void watch(int byteSize) {
this.increment.getAndAdd(byteSize);
}
@Override
public void run() {
for (; ; ) {
try {
TimeUnit.SECONDS.sleep(period);
System.out.printf("%.2f kb/s\n", increment.doubleValue() / period / 1000);
//reset
increment.set(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}