为批量更新累积数据,并在超过大小的阈值限制或定时持续时间后发送数据



随着时间的推移,在web服务器内存中积累到特定限制的数据是一个好策略吗?在每隔指定的时间间隔或当数据增长大于阈值大小时,将其作为批量更新发送。

这种类型的数据将非常小,就像在两个实体之间添加关系一样,这意味着只向行添加一组id。

(当然,延迟的数据应该不会立即可见)。

这种方法有什么缺点吗?


用法:使用Cassandra DB构建web应用,使用Java &JSF。

简短的回答:这是个坏主意。

Cassandra的批处理操作(例如http://pycassa.github.com/pycassa/api/pycassa/batch.html)允许你在一个幂等单元中分组更新。这允许您将批处理作为一个单元重试,因此其目的大致类似于关系数据库中的事务。

但是,与事务类比不同,对性能的影响可以忽略不计,实际上,人为地使负载"突发"通常会适得其反。

它的主要缺点是需要另一个线程来实现超时(复杂性很小),但是好处可能要大得多。

实现这一点的一个简单方法是使用wait/notify(使用并发库似乎没有一个好的解决方案)

private final List<T> buffered = new ArrayList<T>();
private final int notifySize = ...
private final int timeoutMS = ...
public synchronized void add(T t) {
    buffered.add(t);
    if (buffered.size() >= notifySize)
       notifyAll();
}
public synchronized void drain(List<T> drained) throws InterruptedException {
    while(buffered.isEmpty())
        wait(timeoutMS);
    drained.addAll(buffered);
    buffered.clear();
}

add和drain可以被任意数量的线程调用,但是我想象您只会有一个线程在排水,直到它被中断。

最新更新