Hector (API)
Original author(s) | Ran Tavory |
---|---|
Stable release | 0.7.0-23 |
Preview release | none / n/a |
Development status | Inactive |
Written in | Java |
Operating system | Cross-platform |
Available in | English |
Type | Column-oriented DBMS |
License | MIT License |
Website | https://github.com/hector-client/hector |
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,[1] that is encapsulated by Hector.[2] It also has Maven repository access.[3]
Contents
History
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 ]
Features
The high-level features of Hector are[1]
- A high-level object oriented interface to Cassandra: It is mainly inspired by the Cassandra-java-client. The API is defined in the Keyspace interface.
- Connection pooling. As in high-scale applications, the usual pattern for DAOs is a large number of reads/writes. It is too expensive for clients to open new connections with each request. So, a client may easily run out of available sockets, if it operates fast enough. Hector provides connection pooling and a nice framework that manages the details.
- Failover support: As Cassandra is a distributed data store where hosts (nodes) may go down. Hector has its own failover policy.
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 |
- JMX support: Hector exposes JMX for many important runtime metrics, such as number of available connections, idle connections, error statistics.
- Load balancing: A simple load balancing exists in the newer version.[4]
- Supports the command design pattern to allow clients to concentrate on their business logic and let Hector take care of the required plumbing.
Availability metrics
Hector exposes availability counters and statistics through JMX.[5]
Load balancing
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. . [6]
Pooling
The ExhaustedPolicy
determines how the underlying client connection pools are controlled. Currently, three options are available:[7]
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) |
Code examples
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;
}
});
}
References
- ↑ 1.0 1.1 Lua error in package.lua at line 80: module 'strict' not found.
- ↑ Lua error in package.lua at line 80: module 'strict' not found.
- ↑ Lua error in package.lua at line 80: module 'strict' not found.
- ↑ Lua error in package.lua at line 80: module 'strict' not found.
- ↑ Lua error in package.lua at line 80: module 'strict' not found.
- ↑ Lua error in package.lua at line 80: module 'strict' not found.
- ↑ Lua error in package.lua at line 80: module 'strict' not found.