Original author(s) | Ran Tavory |
---|---|
Final release | 2.0
/ July 16, 2014[1] |
Repository | github |
Written in | Java |
Type | Column-oriented DBMS |
License | MIT License |
Website | prettyprint |
Hector is a high-level client API for Apache Cassandra. Named after Hector, a warrior of Troy in Greek mythology, it is a substitute for the Cassandra Java Client, or Thrift,[2] that is encapsulated by Hector.[3] It also has Maven repository access.[4]
As Cassandra is shipped with the low-level Thrift (protocol), there was a potential to develop a better protocol for application developers. Hector was developed by Ran Tavory as a high-level interface that overlays the shortcomings of Thrift. It is licensed with the MIT License that allows to use, modify, split and change the design.[dubious ]
The high-level features of Hector are[2]
Type | Comment |
---|---|
FAIL_FAST |
If an error occurs, it fails |
ON_FAIL_TRY_ONE_NEXT_AVAILABLE |
Tries one more host before giving up |
ON_FAIL_TRY_ALL_AVAILABLE |
Tries all available hosts before giving up |
Hector exposes availability counters and statistics through JMX.[6]
Hector follows two load balancing policies with the LoadBalancingPolicy
interface. The default is called RoundRobinBalancingPolicy
and is a simple round-robin distribution algorithm. The LeastActiveBalancingPolicy
routes requests to the pools having the lowest number of active connections, ensuring a good spread of utilisation across the cluster. .
[7]
The ExhaustedPolicy
determines how the underlying client connection pools are controlled. Currently, three options are available:[8]
Type | Comment |
---|---|
WHEN_EXHAUSTED_FAIL |
Fails acquisition when no more clients are available |
WHEN_EXHAUSTED_GROW |
The pool is automatically increased to react to load increases |
WHEN_EXHAUSTED_BLOCK |
Block on acquisition until a client becomes available (the default) |
As an example, an implementation of a simple distributed hashtable over Cassandra is listed.
/**
* Insert a new value keyed by key
* @param key Key for the value
* @param value the String value to insert
*/
public void insert(final String key, final String value) throws Exception {
execute(new Command(){
public Void execute(final Keyspace ks) throws Exception {
ks.insert(key, createColumnPath(COLUMN_NAME), bytes(value));
return null;
}
});
}
/**
* Get a string value.
* @return The string value; null if no value exists for the given key.
*/
public String get(final String key) throws Exception {
return execute(new Command(){
public String execute(final Keyspace ks) throws Exception {
try {
return string(ks.getColumn(key, createColumnPath(COLUMN_NAME)).getValue());
} catch (NotFoundException e) {
return null;
}
}
});
}
/**
* Delete a key from cassandra
*/
public void delete(final String key) throws Exception {
execute(new Command(){
public Void execute(final Keyspace ks) throws Exception {
ks.remove(key, createColumnPath(COLUMN_NAME));
return null;
}
});
}