1 状态管理的基本概念
1.1 什么是状态
1.1.1 无状态的例子:消费延迟计算
消息队列:
一个生产者持续写入,多个消费组分别读取,如何实时统计每个消费者落后多少条数据?
//输入
{
"timestamp": 1555516800,
"offset":
{
"producer": 16,
"consumer0": 10,
"consumer1": 7,
"consumer2": 12
}
}
//输出
{
"timestamp": 1555516800,
"lag":
{
"consumer0": 5,
"consumer1": 8,
"consumer2": 3
}
}
- 单条输入包含所需的所有信息
- 相同输入可以得到相同输出
1.1.2 有状态计算的例子:访问量统计
Nginx访问日志,每个请求访问一个URL地址,如何实时统计每个地址总共被访问了多少次?
输入输出:
{
"@timestamp": "18/Apr/2019:00:00:00",
"remote_addr": "127.0.0.1",
"request": "GET",
"url": "/api/a"
}
{
"url": "/api/a",
"count": 1
}
{
"@timestamp": "18/Apr/2019:00:00:00",
"remote_addr": "127.0.0.1",
"request": "POST",
"url": "/api/b"
}
{
"url": "/api/b",
"count": 1
}
{
"@timestamp": "18/Apr/2019:00:00:00",
"remote_addr": "127.0.0.1",
"request": "GET",
"url": "/api/a"
}
{
"url": "/api/a",
"count": 2
}
- 单挑输入仅包含所需的部分信息:当前请求信息
- 相同输入可能得到不同输出:当前请求之前的累计访问量
1.1.3 需要使用状态的场景
- 去重:记录所有的主键
- 窗口计算:已进入的未触发的数据
- 机器学习|深度学习:训练的模型及参数
- 访问历史数据:需要与昨日进行对比
1.2 状态管理
最直接的方式:内存
- 存储容量限制
- 备份与恢复
- 横向扩展
对流式作业的要求
- 7*24小时运行,高可靠
- 数据不丢不重,恰好计算一次
- 数据实时产出,不延迟