Size: a a a

Saint P Ruby Community

2020 May 18

MS

Mikhail Sytchev in Saint P Ruby Community
хотя, менеджеры и рефка — это публичная часть, может такого там не будут делать
источник

MS

Mikhail Sytchev in Saint P Ruby Community
но мы пострадали недавно =)
источник

PP

Pavel Peganov in Saint P Ruby Community
У меня тут вот какая тема есть.
Допустим, есть приложение на руби, которому нужно обновлять локали прямо в процессе работы. Но при этом нужно, чтобы посреди обработки каждого отдельного запроса версия локалей не менялась, т. е. чтобы не возникало ситуации, что посреди вьюхи начинает использоваться новая версия локалей, не согласующаяся с отрендернным ранее.

Удручает, что I18n синглтон. И у него один бэкенд. И я что-то не нахожу механизма запомнить и использовать старые переводы до момента, когда будет безопасно переключиться на новые (когда запрос обработается).
Кто-нибудь знает уже существующие решения для этого?
источник

PP

Pavel Peganov in Saint P Ruby Community
Мне приходили в голову решения, но они все требуют либо написать к I18n-бэкендам новый фронт (или использовать в бэкенде thread local, что сработает у нас, ибо каждый запрос в своём треде, но как-то... meh), либо блокировать обработку неначавшихся сообщений и/или уводить весь процесс на graceful restart.
источник

IK

Igor Khodyrev in Saint P Ruby Community
Pavel Peganov
У меня тут вот какая тема есть.
Допустим, есть приложение на руби, которому нужно обновлять локали прямо в процессе работы. Но при этом нужно, чтобы посреди обработки каждого отдельного запроса версия локалей не менялась, т. е. чтобы не возникало ситуации, что посреди вьюхи начинает использоваться новая версия локалей, не согласующаяся с отрендернным ранее.

Удручает, что I18n синглтон. И у него один бэкенд. И я что-то не нахожу механизма запомнить и использовать старые переводы до момента, когда будет безопасно переключиться на новые (когда запрос обработается).
Кто-нибудь знает уже существующие решения для этого?
А чем не устраивает подхватывать локали при старте и редеплоить без даунтайма? Ну то есть по сути не подгружать их во время работы. Или локали очень часто меняются?
источник

PP

Pavel Peganov in Saint P Ruby Community
Igor Khodyrev
А чем не устраивает подхватывать локали при старте и редеплоить без даунтайма? Ну то есть по сути не подгружать их во время работы. Или локали очень часто меняются?
Ну, в идеале да, хотелось бы менять локали часто. В продакшене этого не будет, но в тестовых окружениях было бы полезно.
С деплоями и рестартами не хотелось бы связываться, потому что это вызовет ненужный скачок нагрузки, которого вроде как легко избежать.
источник

PP

Pavel Peganov in Saint P Ruby Community
Ну, то есть, мне понятно, как технически такое решение может выглядеть, просто не верится что это до сих пор никто не оформил в библиотеку 🙂
источник

PP

Pavel Peganov in Saint P Ruby Community
У меня довольно необычный случай, локали не используются в коде напрямую. Шаблоны, в которых локали нужны, подаются и обновляются тоже в рантайме.
источник

IK

Igor Khodyrev in Saint P Ruby Community
А как и где вы новые локали подгружаете?
источник

PP

Pavel Peganov in Saint P Ruby Community
Система пока гипотетическая, это вроде не особо важно для задачи. Исходная мысль была держать в каждом процессе watch над ключом в etcd, срабатывание которого приводило бы к скачиванию новой версии переводов по HTTP (возможно, определённой по ссылке в этом ключе, звучит заманчиво для роллбэков). Вот скачивания и записи куда — уже часть вопроса.
источник

IK

Igor Khodyrev in Saint P Ruby Community
Ну, тут 3 варианта как по мне:
1) редеплой для подгрузки локалей
2) 1 процесс - 1 реквест
3) какой-то свой бэкэнд с использованием Thread.current

Существующих решений не видел, я бы пошёл способом 1, если сервис небольшой и/или обновления не особо частые, 3, если 1 не подходит.

Вариант 2 право на жизнь имеет, так как самый простой и быстрый для реализации.
источник

PP

Pavel Peganov in Saint P Ruby Community
1) Ну, как минимум graceful restart, процесс может послать сам себе SIGTERM, например, чтоб прекратилась обработка новых запросов, а после рестарта подгрузилась новая версия и ок.
2) Очень медленно. Слишком много переинициализировать на каждый чих. Для тестовых сред сойдёт, но хотелось бы чтоб в проде было то же самое :}
3) Вот да, я выше это упоминал.
...но всё это не было бы нужно, будь метод #t не у синглтона, а у инстанса, которых в процессе могло бы быть несколько; и время жизни каждого можно было б разрулить самостоятельно ☹️
источник

IM

Igor Morozov in Saint P Ruby Community
а есть вариант наколхозить своё решение на основе gettext?
источник

IM

Igor Morozov in Saint P Ruby Community
или найти такое, что оборачивается над геттекстом 🤔
источник

IK

Igor Khodyrev in Saint P Ruby Community
Как вариант, сделать не синглтон инклюдом I18n::Base в свой класс. Но не могу сказать есть ли с этим проблемы.
источник

PP

Pavel Peganov in Saint P Ruby Community
Igor Morozov
а есть вариант наколхозить своё решение на основе gettext?
Слышал только про формат такой, но не про библиотеку.
Вот этого?
https://github.com/ruby-gettext/gettext
источник

PP

Pavel Peganov in Saint P Ruby Community
Igor Khodyrev
Как вариант, сделать не синглтон инклюдом I18n::Base в свой класс. Но не могу сказать есть ли с этим проблемы.
Вот и я склоняюсь к какому-то такому решению. https://t.me/saintprug/53936
источник

АШ

Алексей Шеин... in Saint P Ruby Community
Может что-то типа https://github.com/shioyama/mobility поможет
источник

PP

Pavel Peganov in Saint P Ruby Community
Хм-м... нет, непохоже. Эта штука для другого рода переводов — для атрибутов конкретных сущностей из БД. Не очень понимаю, ни как натянуть её на эту задачу, ни чем она поможет 🙃
Но за ссылку спасибо, может пригодиться где-нибудь 🙂
источник
2020 May 20

DS

Dmitriy Strukov in Saint P Ruby Community
А какой самый оптимальный алгоритм нахождения максимально числа с вставкой цифры 5?

Например:
64
654

0
50
источник