code: func (ns *NatsRPCServer) Init() error {
  	// TODO should we have concurrency here? it feels like we should
  	go ns.handleMessages()
  	conn, err := setupNatsConn(ns.connString, ns.appDieChan, nats.MaxReconnects(ns.maxReconnectionRetries))
  	if err != nil {
  		return err
  	}
  	ns.conn = conn
  	if ns.sub, err = ns.subscribe(getChannel(ns.server.Type, ns.server.ID)); err != nil {
  		return err
  	}
  
  	err = ns.subscribeToBindingsChannel()
  	if err != nil {
  		return err
  	}
  	// this handles remote messages
  	for i := 0; i < ns.config.GetInt("pitaya.concurrency.remote.service"); i++ {
  		go ns.processMessages(i)
  	}
  
  	session.OnSessionBind(ns.onSessionBind)
  
  	// this should be so fast that we shoudn't need concurrency
  	go ns.processPushes()
  	go ns.processSessionBindings()
  	go ns.processKick()
  
  	return nil
  }
docs: // Init inits nats rpc server