config | ||
server | ||
storage | ||
.travis.yml | ||
AUTHORS | ||
CONTRIBUTORS | ||
LICENSE | ||
main.go | ||
README.md |
Chihaya
Chihaya is a high-performance BitTorrent tracker written in the Go programming language. It is still heavily under development and should not be used in production. Some of the planned features include.
- Low resource consumption
- Fast request processing
- Maximum compatibility with what exists of the BitTorrent spec
- Correct IPv6 support
- A generic storage interface that is easily adapted to use any data store
- Scaling properties that directly correlate with those of the chosen data store
Architecture
You are most likely looking to integrate Chihaya with a web application for organizing torrents and managing a community. Chihaya was designed with this in mind, but also tries to remain independent. Chihaya has its own data store that needs to be bootstrapped with data from your web application. ZeroMQ is used to publish changes to this data. Your web application must subscribe to this stream, collect these changes, and apply them (usually in a batch fashion). The only caveat to this architecture is that when a torrent is added or deleted your web application needs to update both its own data store and Chihaya's.
Installing
Make sure you have your $GOROOT and $GOPATH set up correctly and have your $GOBIN on your $PATH. You'll also need to install ZeroMQ with your favourite package manager. Next, you'll need to "go get" the correct version of the gozmq library that corresponds to your system's version. For example, these are the steps you'd use to install on Ubuntu 12.04 LTS:
$ sudo apt-get install libzmq-dev
$ go get -tags zmq_2_1 github.com/alecthomas/gozmq
$ go install github.com/pushrax/chihaya
Configuring
Configuration is done in a JSON formatted file specified with the -config
flag. An example configuration can be seen in the exampleConfig
variable of
config/config_test.go
.
Default storage drivers
Chihaya currently supports the following data stores out of the box:
Custom storage drivers
The storage
package is heavily inspired by the standard library's
database/sql
package. To write a new storage backend, create a new Go
package that has an implementation of the Pool
, Tx
, and Driver
interfaces. Within that package, you must also define an init()
that calls
storage.Register
.
Please read the documentation and understand these interfaces as there are
assumptions made about thread-safety. After you've implemented a new driver,
all you have to do is remember to add import _ path/to/your/library
to the
top of any file in your project (preferably main.go
) and the side effects from
func init()
will globally register your driver so that config package will recognize
your driver by name. If you're writing a driver for a popular data store, consider
contributing it.
Contributing
If you're interested in contributing, please contact us in #chihaya on freenode or post to the GitHub issue tracker. Please don't offer massive pull requests with no prior communication attempts as it will most likely lead to confusion and time wasted for everyone. However, small unannounced fixes are always welcome.
And remember: good gophers always use gofmt!