use channels instead of callbacks
add publisher benchmark