Я не сторонник лишних gems. Если необходим какой-либо несистемный функционал (например, state machine), то вместо того, чтобы тянуть в проект какую-то стороннюю OpenSource либу (которая вместе с нужным функционалом добавляет ненужный потайной функционал "магического характера"), я лучше потрачу тоже самое время на разработку собственной библиотеки, которая может уместиться в 1-3 класса, чем разбираться в коде и в случае багов выяснять, где проблема: "у нас или у них там в геме?". Либо выдеру из гема нужный мне код без лишнего.
Ответ на вопрос:
- rspec
- composite_primary_keys
- omniauth (omniauth-instagram, omniauth-vkontakte, omniauth-google-oauth2)
- devise
- kaminari
- json-schema + dry-validation - огонь-гемы, позволяющие очень быстро валидировать приходящие параметры с форм (пример: https://gist.github.com/c80609a/f9326ac3169f335fb10e71be7714bb38)
- virtus - частично был заменён на
json-schema
, выпиливается - mini_magick
- bunny
- backburner
- phonelib
- curb -
Easy::Curl
для клиентов, которые общаются, например, с ЯндексКассой - mongoid
- dalli - для работы с memcached
- newrelic_rpm
- prawn - для генерации PDF
- cancan, pundit (выпилены впоследствии, заменены на таблицу с привилегиями, спец-кода в route.rb и обработку Devise warden)
- aasm (вообще шляпа, досталась в наследство с проектом)
Ror, hanami, своё.
update:
- sinatra -- для "mock-серверов", если пишется/тестится, например, клиент для sms.ru
- trailblazer -- из него была взята теория: контроллеры заняты маршрутизацией, сервисы заняты бизнес-логикой и пр.
- goliath -- давно смотрел, как можно реализовывать ruby async app
React, pure js
mysql, postgres
5) Какой stack технологий рационально использовать для создания интернет магазина с ожидаемым трафиком 1000 rps?
- Кэшировать вьюхи\json в memcached -- и тогда не важно какая рельса и с каким шаблонизатором стоит позади этого барьера. Само собой, нужен будет код, который отслеживает изменения и валидирует кэш. Так работатет, например, RuTube (но у них бэк на питоне, но сути это не меняет).
- Использовать адаптеры для иницализации сущностей, данные для которых хранятся не базе, а, например, в memcached
- Вместо sidekiq, который запускает копию приложения, я бы воспользовался легковесными самописными скриптами (можно назвать их микросервисами), которые запускаются и демонизируются с помощью systemctl, слушая очередь сообщений (backburner, rabbit).
- Модели бы в эти микросервисы я подключил с помощью git submodules.
- Общий код в виде словарей и сериалайзеров завернул бы в свой gem.
-
The Template Method pattern - самый ходовой и практичный. Позволяет инкапсулировать неизменяющуюся логику (алгоритм) в базовом классе,а меняющийся код упаковать в подклассы.
-
Далее идёт стратегия. Например, если Инстаграм забанил моего кравлера, который парсит подписчиков с помощью официально API,главный скрипт это детектит и меняет стратегию - теперь Инстаграм парсится с помощью phantom.js до тех пор, пока девелопер не создаст несколько новых аккаунтов, с помощью которого можно дальше парсить официально.
-
Адаптер. Т.к. код, который пишут программисты, слабо стандартизируем и, порой, пишется со скоростью мысли. И иногда вместо того, чтобы лезть во внутрь класса и втыкать туда свои подпорки и костыли, проще написать адаптер, который обернёт этот класс и предоставит нужный мне и приложению интерфейс. Адаптер - это еще и возможность менять хранилище в таких фреймворках, как hanami - либо пишем в быструю память, либо в базу, либо в файлы, сохраняя при этом единый интерфейс.
-
State machine, decorator
-
Service Objects - не уверен, паттерн ли это. Но данный подход позволяет разгрузить контроллеры (которые должны содержать лишь логику маршрутизации - как и при каких условиях отвечать 200, 404, 202) и тестировать сервисы отдельно.
Ответ на вопрос: flamegraph, benchmark,gem 'memory_profiler'
Т.к. я в основном работал с проектами, где:
- ActiveRecord модели это всего лишь DAO (data acces object) с описанием взаимосвязей,
- вместо строк используются symbols
- любят raw sql
- минимальное количество gems, которые добавляют в проект неизвестной f..kn magic,
- для react-фронта собирается JSON и вью это рендерится на стороне клиента
-- то вопрос профилирования -- самый последний вопрос, у нас все работало и работает быстро.
-
пример кода, внедрённый в рельсу по образу и подобию hanami (Юридическое лицо и ActiveRecord репозиторий, работающий с этой сущностью): https://gist.github.com/c80609a/cb663e804162301ae51115bb1233385b
-
not STI: https://gist.github.com/c80609a/2bb2c124c0f851c39bffbc95c93109d6
-
пример, как валидирутся параметры с помощью JSON Schema + RSpec: https://gist.github.com/c80609a/08d56a14272ab7dab526cb26f071d44a
-
репозиторий с raw sql: https://gist.github.com/c80609a/c1907260058b3bc89c9c8bf80deaa4d4
-
клиент, работающий с яндекс-кассой (один из сервисов, использующий клиент; фрагмент контроллера, работающего с сервисом): https://gist.github.com/c80609a/af4e47e163995eebd3e05ba9e62b5b1b
-
просто скрипт с Enumerator, который парсит наш gitlab в Excel: https://gist.github.com/c80609a/ba8e692d2928cdeeac1b5eed0b3c1257
Фрагмент кода на React, позволяющий рисовать графики с помощью d3:
- код - https://gist.github.com/c80609a/8b0d8eaceae6dfb46eca902d7622395d
- Скрин - https://gist.github.com/c80609a/8b0d8eaceae6dfb46eca902d7622395d#gistcomment-3045734
Pure Js, позволяющий форматировать строки вида "от 1500 $ в месяц" на основании списка цен, которые приходят в JSON с учётом региона и локали:
- код - https://gist.github.com/c80609a/fc978835cf396a4b977061669c1f6456
- тесты (rus) - https://gist.github.com/c80609a/fc978835cf396a4b977061669c1f6456#file-test-ru-js
- тесты (eng) - https://gist.github.com/c80609a/fc978835cf396a4b977061669c1f6456#file-test-en-js
- данные, которые скармливаются скрипту - https://gist.github.com/c80609a/fc978835cf396a4b977061669c1f6456#file-zdata-json
Немного Sagas:
nope
nope (на работе и так есть чем заняться)