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

Java 每当有任何新行或任何新更新时,从Cassandra数据库中提取?,java,triggers,cassandra,apache-zookeeper,Java,Triggers,Cassandra,Apache Zookeeper,我正在开发一个系统,需要在Cassandra数据库中存储Avro模式。所以在卡桑德拉,我们将存储类似的东西 SchemaId AvroSchema 1 some schema 2 another schema 现在假设我在上面的卡桑德拉表格中插入另一行,现在表格是这样的- SchemaId AvroSchema 1 some schema

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

SchemaId            AvroSchema

1                   some schema
2                   another schema
现在假设我在上面的卡桑德拉表格中插入另一行,现在表格是这样的-

SchemaId            AvroSchema

1                   some schema
2                   another schema
3                   another new schema
一旦我在上表中插入新行,我需要告诉我的Java程序去提取新的模式id和相应的模式

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

我知道,一种方法是每隔几分钟进行一次轮询,比如说每5分钟我们将从上表中提取数据,但这不是解决此问题的正确方法,因为每5分钟,无论是否存在任何新模式,我都会进行一次提取。

但除此之外还有其他解决办法吗

我们能用ApacheZooKeeper吗?或者动物园管理员不适合这个问题? 还是其他解决方案

我正在运行Apache Cassandra 1.2.9

一些解决方案:

  • 对于数据库触发器:Cassandra 2.0有一些触发器支持,但它看起来不是最终版本,根据本文,可能会在2.1中有所更改:。触发器是一种常见的解决方案
  • 你提到了投票,但这并不总是一个坏的选择。特别是如果你有一些东西标记那一行还没有被拉出,那么你可以直接从Cassandra中拉出新行。如果查询成本不高,那么每5分钟拉一次对Cassandra或任何数据库来说都不是负载明智的。如果很少插入新行,此选项可能不好
Zookeeper不是一个完美的解决方案,请参见以下引文:

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

报价来源:卡桑德拉3.0

您可以使用它,它将把insert中的所有内容都作为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();
    }
}
公共类HelloWorld实现ITrigger
{
私有静态最终记录器Logger=LoggerFactory.getLogger(HelloWorld.class);
公共集合扩充(分区)
{
字符串tableName=partition.metadata().cfName;
logger.info(“表:”+表名);
JSONObject obj=新的JSONObject();
put(“message_id”,partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()));
试一试{
UnfilteredRowIterator it=partition.unfilteredIterator();
while(it.hasNext()){
未过滤的un=it.next();
集群clt=(集群)un.Clustering();
迭代器单元格=partition.getRow(clt.cells().Iterator();
迭代器列=partition.getRow(clt.columns().Iterator();
while(columns.hasNext()){
ColumnDefinition columnDef=columns.next();
Cell=cells.next();
字符串数据=新字符串(cell.value().array());//如果单元格类型为文本
obj.put(columnDef.toString(),数据);
}
}
}捕获(例外e){
}
debug(obj.toString());
返回集合。emptyList();
}
}

谢谢您的建议。。所以根据您的说法,在我的用例中,轮询选项要好得多?我没有其他选择可以使用吗?感谢您的帮助…我不知道您的用例中的所有因素,但根据我到目前为止所听到的,轮询还不是一个应该取消的选项。我已经为此创建了一个存储库,可用于创建一个新项目和要执行的ant build文件。如需更多帮助,请与我联系。