Java 每当有任何新行或任何新更新时,从Cassandra数据库中提取?
我正在开发一个系统,需要在Cassandra数据库中存储Avro模式。所以在卡桑德拉,我们将存储类似的东西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
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或任何数据库来说都不是负载明智的。如果很少插入新行,此选项可能不好
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文件。如需更多帮助,请与我联系。