每当有新行或任何新更新时,从Cassandra数据库中取出?

时间:2013-10-24 17:50:41

标签: java triggers cassandra apache-zookeeper

我正在开发一个系统,我需要在Cassandra数据库中存储Avro Schemas。所以在Cassandra,我们将存储类似的东西

SchemaId            AvroSchema

1                   some schema
2                   another schema

现在假设我在Cassandra的上表中插入另一行后现在表格就像这样 -

SchemaId            AvroSchema

1                   some schema
2                   another schema
3                   another new schema

只要我在上表中插入一个新行 - 我需要告诉我的Java程序去拉新模式ID和相应的模式..

解决这类问题的正确方法是什么?

我知道,一种方法是每隔几分钟进行一次轮询,让我们说每5分钟我们就会从上表中提取数据,但这不是每5分钟解决这个问题的正确方法无论是否有任何新架构,我都在拉动。

但除此之外还有其他解决方案吗?

我们可以使用Apache Zookeeper吗?或者Zookeeper不适合这个问题? 还是其他任何解决方案?

我正在运行Apache Cassandra 1.2.9

2 个答案:

答案 0 :(得分:1)

一些解决方案:

  • 使用数据库触发器:Cassandra 2.0有一些触发器支持,但看起来它不是最终的,根据这篇文章可能会在2.1中稍微改变一下:http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-0-prototype-triggers-support。触发器是一种常见的解决方案。
  • 你提出了民意调查,但这并不总是一个糟糕的选择。特别是如果你有一些东西标记该行还没有被拉动,那么你可以从Cassandra中拉出新的行。如果查询费用不高,那么每5分钟拉一次对于Cassandra或任何数据库来说都不是明智之举。如果很少插入新行,则此选项可能不太好。

Zookeeper不是一个完美的解决方案,请看这个引用:

  

因为手表是一次触发并且之间存在延迟   获得活动并发送新请求以获得您无法获得的手表   可靠地查看ZooKeeper中节点发生的每个更改。是   准备处理znode多次更改的情况   在获取活动和再次设置手表之间。 (你不可以   关心,但至少意识到它可能会发生。)

来自:http://zookeeper.apache.org/doc/r3.4.2/zookeeperProgrammers.html#sc_WatchRememberThese

的报价

答案 1 :(得分:1)

Cassandra 3.0

你可以使用它,它会把插件中的所有内容作为json对象。

public class HelloWorld implements ITrigger
{
    private static final Logger logger = LoggerFactory.getLogger(HelloWorld.class);

    public Collection<Mutation> augment(Partition partition)
    {
        String tableName = partition.metadata().cfName;
        logger.info("Table: " + tableName);

        JSONObject obj = new JSONObject();
        obj.put("message_id", partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()));

        try {
            UnfilteredRowIterator it = partition.unfilteredIterator();
            while (it.hasNext()) {
                Unfiltered un = it.next();
                Clustering clt = (Clustering) un.clustering();  
                Iterator<Cell> cells = partition.getRow(clt).cells().iterator();
                Iterator<ColumnDefinition> columns = partition.getRow(clt).columns().iterator();

                while(columns.hasNext()){
                    ColumnDefinition columnDef = columns.next();
                    Cell cell = cells.next();
                    String data = new String(cell.value().array()); // If cell type is text
                    obj.put(columnDef.toString(), data);
                }
            }
        } catch (Exception e) {

        }
        logger.debug(obj.toString());

        return Collections.emptyList();
    }
}