# METER_WORK_MONITOR Tarantool 内存加速方案

## 背景

`METER_WORK_MONITOR` 为计量监控热点表。`POST /doUpdateWf` 与 `POST /doUpdateWfBySpotNo`（`updateLastTime`）写入频率高，直接打 Oracle 易形成锁竞争与连接压力。

## 目标

1. 在 Tarantool（memtx）建立与 Oracle 同结构的内存表 `METER_WORK_MONITOR`。
2. 基于 `icore-rtdb` 自建多 `Client` 连接池，支撑高并发写入。
3. 上述两个接口只写 Tarantool，立即返回。
4. 定时 Job 将脏数据回写 Oracle。

## 架构

```
秤点/前端 → MeterWorkMonitorController
         → MeterWorkMonitorServiceImpl
         → MeterWorkMonitorRtdbRepository
         → RtdbClientPool → Tarantool METER_WORK_MONITOR

MeterWorkMonitorSyncScheduler → SyncService
  → 读 Tarantool dirty 行 → batchUpdateSelective → Oracle
  → 清 dirty
```

## 文档索引

| 文档 | 说明 |
|------|------|
| [01-tarantool-schema.md](01-tarantool-schema.md) | Space 字段、类型、冷启动 |
| [02-rtdb-connection-pool.md](02-rtdb-connection-pool.md) | 连接池设计与配置 |
| [03-write-path.md](03-write-path.md) | 写入路径与失败策略 |
| [04-oracle-sync-job.md](04-oracle-sync-job.md) | 回写 Job |
| [ddl/meter_work_monitor.lua](ddl/meter_work_monitor.lua) | Tarantool 建表脚本 |

## 一致性与降级

- **一致性**：写路径最终一致；Oracle 落后于 Tarantool 最多一个 Job 周期（默认 1 分钟）。
- **降级**：`rtdb.monitor.fallback-oracle=true` 时，Tarantool 写失败回退原 Oracle `updateByPrimaryKeySelective`。
- **范围外**：`PUT /{id}`、`MeterWorkCarActualFirst*` 等其它 Oracle 直写路径不变；`TestClient2` / `DbConstants.client` 暂保留。

## 配置开关（摘要）

```properties
rtdb.host=172.22.42.3
rtdb.port=2101
rtdb.username=guest
rtdb.password=
rtdb.pool.size=8
rtdb.pool.borrow-timeout-ms=3000
rtdb.monitor.enabled=true
rtdb.monitor.fallback-oracle=false
rtdb.monitor.bootstrap-enabled=false
meter.monitor.sync.enabled=false
meter.monitor.sync.cron=0 */1 * * * ?
```
