more work on the consumer, and on the partitioner. fleshed out SyncGoup
more work on the consumer, and on the partitioner. fleshed out SyncGoup

the act of partitioning is broken out, and implemented by the Partitioner interface. users can customize as desired all the way down to the kafka join and sync messages.
asynchronous errors are returned in Client.Errors() channel
instead of a client.lock, adding a consumer is done by sending a message to client.run goroutine. That moves all the variable bits into run()'s locals, and makes the code safer and more compact. That does mean a call to Consume() can block until an IO routine is complete if run() is in the middle of a join.
a simple round-robin partitioner. (it's 75 lines of code, but all but one line (98.6%) is busywork or comments)

mistsys/sarama-consumer