Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Отличная статья!

Важное замечание: не следует использовать amqproxy для consumer, есть проблемы одностороннего разрушения соединений.

А вот столкнулись тут недавно с одной проблемой, связанной с проксированием, что через amqproxy, что через haproxy, через какое-то время перестают приходить ответы на rpc запросы в celery.

Если celery.broker и celery.backend указать на сам сервер rabbitMQ, то всё работает стабильно. Но через проси нет, задача создаётся в брокере, но от нескольких минут до нескольких часов проходит, и просто перестаёт приходить ответ. Причём через этого же самого брокера сообщения в очереди уходят, но механизм rpc ломается.

Было подозрение что столкнулись с "флаппингом каналов", про него тоже в статье упомянули, очень сильно увеличилось время ответа, и как раз порядок кол-ва примерно похож, но с проксированием ничего не получилось. Пока решилось переработкой логики продюсеров, но вопрос остался, что не так с проксированием ampq.

var pending []Item // заполняется процедурой получения данных, очищается процедурой отправки отчетов о работе
// отправляем информацию о завершенной задаче в канал s.updates
for {
  var first Item
  var updates chan Item
  if len(pending) > 0 {
    first = pending[0]
    updatesChan = s.updates // укажем реальный канал, чтобы разблокировать исполнение в select
  }

  select {
  case updatesChan <- first: // отправляем первый элемент, заблокируется, если канал s.updates = nil
    pending = pending[1:] // когда отправка удаласть, удаляем первый элемент из массива перерписваивая слайс без него
  }
}

Зачем здесь канал updates который не используется далее по коду?

При len(pending) = 0 в канал updatesChan, который ссылается на s.updates (не nil), будет передан first который nil. При этом в данном коде переменная updatesChan выше скопа цикла, следовательно при len(pending) = 0 она все равно будет указывать на s.updates (т.е. updatesChan = s.updates в условии бесмыслено if len(pending) > 0)

А что делать с 2003 сервером? Вкусностей типа изоляции драйверов и Easy Print там нет.
Многие прогрессивные посоны объявляют события так:

public event MethodContainer OnCount = delegate{};
Уже давно использую такую методику на живом проекте на Ruby On Rails, очень удобно. Правда при входе под другим пользователем авторизация админа сбрасывается, но это не доставляет особых неудобств.

Код для Ruby On Rails в связке с Devise

 def become
    sign_out :admin
    sign_in(:user, User.find(params[:id]))
    redirect_to root_url
  end
Оказывается можно. Скажем, для того чтобы доустановить русскоязычные пакеты к английской студии нужно сделать следующее:
1) Поставить language pack к системе справки. Паки находятся в корне инсталляционного диска студии и выглядят как HelpSetupLP_arch_lang.exe, где arch и lang — архитектура и язык, соответственно. В данном случае нужно ставить русский.
2) Запустить HelpLibManager.exe (обычно находится в папке \Program Files\Microsoft Help Viewer\v1.0\) с параметрами /product VS /version 100 /locale ru-RU (последний параметр отвечает за язык) и установить нужные разделы.
3) Для просмотра справки придется использовать утилиту H3Viewer, которая позволяет с легкостью переключать язык. К слову, данный просмотрщик гораздо функциональнее и быстрее стандартного, а также прекрасно интегрируется со студией.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Backend Developer, Server Administrator
C#
Linux
Golang
Docker
Git
SQL
.NET