Sentinel - как закрыть подчиненные соединения? - PullRequest
0 голосов
/ 04 сентября 2018

У меня тут какой-то странный вопрос (наверное)

главное, что я использую часовые в моем приложении, и когда основной экземпляр меняется - я открываю новые подключения к реальному экземпляру (здесь все в порядке).

и проблема в том, что я не смог найти способ закрыть соединения, которые подключены к ведомому экземпляру

На самом деле я могу закрыть соединения, когда получаю сообщение типа << "READONLY. Вы не можете писать против ведомого только для чтения." >>

но в случае, если у меня есть пул из 1500 соединений, он может закрыть их пару минут (p: s я проверяю здоровье каждые 5 секунд)

Есть ли другое (более быстрое) решение?

вот части моего кода:

sentinel_controller.erl

 handle_info(check_master_instance, #state{
  interval = Interval,
  name = CtrlName,
  connected_sentinels = Conns,
  master_instance_name = MasterName} = State) ->
  _ = utils:c_tref(State#state.tref_check_master),
  Masters = get_masters(Conns, MasterName, CtrlName),
  NewState =
    case get_actually_master(Masters) of
      {ok, MasterInstancePeer} ->
        check_pools(MasterInstancePeer, State);
      Error ->
        ?LOG_WARNING("{Sentinel Controller} Error got MasterPeer with reason: ~p~n", [Error]),
        TimerCheckMaster = erlang:send_after(Interval, self(), check_master_instance),
        State#state{tref_check_master = TimerCheckMaster}
    end,
  {noreply, NewState};


check_pools(MasterInstance, #state{
  interval = Interval,
  pool_conf = PoolConf,
  name = ProcsTab,
  pool_started = false} = State) ->
  try
    ok = redis_pool_sup:start_pool(ProcsTab, PoolConf),
    TimerCheckMaster = erlang:send_after(Interval, self(), check_master_instance),
    State#state{tref_check_master = TimerCheckMaster, pool_started = true, master_instance_peer = MasterInstance}
  catch _:_ ->
      ?LOG_WARNING("error started pool Reason: ~p; Master instance: ~p~n", [erlang:get_stacktrace(), MasterInstance]),
      State
  end;
check_pools(NewMasterInstance, #state{
  pool_started = true,
  interval = Interval} = State) ->
  TimerCheckMaster = erlang:send_after(Interval, self(), check_master_instance),
  State#state{tref_check_master = TimerCheckMaster, pool_started = true, master_instance_peer = NewMasterInstance}.

если вам нужны дополнительные фрагменты, пожалуйста, дайте мне знать

Заранее

...