这是关于非常常见的传感器数据处理问题。同步和合并消息/数据流
要同步和合并来自不同来源的传感器数据,我想用Java实现它,而不需要太复杂的第三方库或框架。假设我定义了一个对象(O),它由例如4个属性(A1,... A4)组成。这4个属性来自不同的数据通道,例如套接字通道。
这4个属性一般以1.0〜2.0Hz的速率到达,它们的到达相互独立。 一旦有4个属性(A1,..A4)在同一时间(在一个小的时间窗口内,例如100ms),我从这4个属性构造一个新的对象(O)。
描述性场景如下。 A1〜A4的到达时间点用*标记。
对象O1〜U3分别在t1,t2和t3的时间点构建。 有些属性在t2和t3之间到达,但是对于构造一个对象并不完整,因此它们将被丢弃并被忽略。
A1 * * * *
A2 * * * *
A3 * * *
A4 * * * *
--------|------------|-----------------|----------> time
t1 t2 t3
O1 O2 O3
一些要求:
- 确定的时间点a.s.a.p.从最后传入的4个属性构造一个对象。
- FIFO,O1必须在O2之前构建,等等。
- 减少在Java中的锁定
- 最终丢弃数据如果它们没有完成构造一个对象。
一些快速想法上实施有:
- 存储在时间离散的铲斗的FIFO队列的任何传入属性(每个桶包含4个不同的属性)。
- 同时运行一个无限的线程来检查FIFO队列(从队列的头部),如果任何存储桶已经被4个不同的属性填充。如果是,则构建一个对象并从队列中移除桶。如果某个存储桶未在特定时间段内填满,则该存储桶将被丢弃。
任何建议和更正是值得欢迎的!
只是为了确保我清楚数据的丢失,例如,如果A2-A4在彼此的〜100 ms内没有爆炸,就应该丢弃A1。因此,如果A1到达并且在150毫秒内没有任何反应,那么A2,A3和A4在大约50ms内到达,由于没有有效的A1,所以不会创建对象。如果新的A1在A2,A3和A4中最早的100ms内到达,则可以创建一个对象,如果不是,A2,A3和A4将被丢弃。 – Rich
数据是否应以某种固定的速率到达,以便您知道他们应该到达什么时间? – Kaj
关于它的更多思考,另一种描述的方式是100ms长的滑动窗口,如果数据到达该窗口中的所有四个点,则可以创建一个对象。 – Rich