我正在开发一个系统,我需要在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
答案 0 :(得分:1)
一些解决方案:
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();
}
}