• Дальнейшие этапы в создании Приложения после создания прототипа?

    @xfg
    Нужен один более-менее опытный backend разработчик, ему делегируете все вопросы связанные с разработкой и подбором других необходимых специалистов. Что-то типа Team Lead. Еще до старта, показываете ему что у вас есть на текущий момент, что хотите на выходе и на какой бюджет расчитываете. Подписываете договор и работаете.

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

    Самостоятельно без какого-либо опыта в разработке нанимать команду и ими управлять не самое разумное решение. С большой долей вероятности это закончится тем, что каждый вроде что-то и делал, но конечного результата нет и требовать этот результат не с кого.
    Ответ написан
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    @xfg
    Началось всё с того, что помимо стандартной формы входа на сайт также стали появляться кнопки входа через социальные сети. Например вы зарегистрировались на целевом сайте используя свой аккаунт на твиттере. Затем какое-то время не пользовались целевым сайтом, после чего вернулись и... Вы точно помните что у вас уже есть аккаунт на данном сайте, но вы не помните какой способ входа вы использовали. Перед вами с десяток различных кнопок. Какую из них нажимать? Думаю, история знакомая многим.

    Так вот в какой-то момент появилось исследование суть которого в том чтобы изменить форму входа таким образом, чтобы пользователю теперь было достаточно указать только email-адрес, а дальше система сама определит через какой провайдер был зарегистрирован пользователь на сайте с этим email-адресом и в зависимости от этого может либо отобразить пароль для ввода, сделать редирект на сайт провайдера для подтверждения входа или сразу аутентифицировать пользователя на целевом сайте, если пользователь уже авторизован и имеет необходимые разрешения для целевого сайта на сайте-провайдере (например на twitter.com).

    Таким образом это ничто иное как улучшение взаимодействия с пользователем. Но как и всё в мире имеет определенные недостатки. Например теперь можно узнать зарегистрирован ли определенный пользователь на определенном сайте зная лишь только его email адрес или номер телефона. То есть страдает конфиденциальность.

    Пример реализации можно увидеть на сайте yandex.ru.
    Ответ написан
    Комментировать
  • В чем преимущество "фабричного метода" перед простым созданием объектов?

    @xfg
    Проблема, которую решает фабричный метод - это возможность отложить создание объекта на попозже. Скажем, у вас имеется некий алгоритм, в котором на одном из шагов требуется создание объекта. Вы знаете, что у вас может быть несколько различных реализаций такого объекта. Тогда вы можете создать фабричный метод и использовать его в своем алгоритме для создания объекта. Это позволяет вам переложить ответственность по созданию объекта на подклассы и таким образом написать общий алгоритм не привязываясь к конкретной реализации объекта.

    Советую для понимания посмотреть пример в англоязычной википедии и там же реализацию на Java. Суть в том, что у вас есть игра лабиринт. И есть два режима игры, обычный - когда игрок может перемещаться из комнаты только в смежную комнату и магический режим - когда игрок может перемещаться в любую комнату. Алгоритм самой игры для обоих режимов один и тот же, а вот бизнес-правила перемещения игрока по комнатам - разные. Вы реализуете эти бизнес-правила в OrdinaryRoom и MagicRoom, а в самом алгоритме игры вместо того, чтобы создавать какой-то из этих объектов - вызываете просто абстрактный метод makeRoom(). А затем создаете два подкласса, которые будут реализовывать метод makeRoom и возвращать нужный тип комнаты. Таким образом вы получаете два различных режима игры написав один алгоритм.

    Вообще смысл данного шаблона довольно сложно понять. В интернете его почти всегда объясняют неверно. Прямо как пример на C#. Это совсем не то, о чем писали в книге банды четырех. Пример соответствующий тому о чем рассказывается в книге реализован в примере на Java. Нужно приложить усилия и постараться вникнуть в идею. Можно перед этим изучить Template method, его проще понять, там похожая идея, только там вы перекладываете часть поведения на подклассы, а здесь перекладываете создание объекта на подклассы. Factory method практически всегда используется в связке с Template method если мы говорим о классической реализации шаблона из книги банды четырех.

    Вообще шаблон не настолько распространенный насколько может показаться. Мне с 2002 года в моей практике не пригодился ни разу.
    Ответ написан
    2 комментария
  • Ревью ТЗ, по которому отказ. Какие грубые ошибки совершил?

    @xfg
    subsetofmultiset Бегло посмотрел код. Видно сразу что имеется определенное представление о слоистой/чистой/луковой архитектуре, возможно даже читал что-то из книг Эванса/Вернона по DDD и PoEAA от Мартина Фаулера, ну или как минимум какие-то статьи базирующиеся на информации из этих книг.

    Довольно толково сделано. Единственное это то, что доменные сущности без поведения получились, состояние - есть, поведения - нет. Например следовало пету добавить метод любить человека, туда поместить бизнес-правила и если они все соблюдаются то создавать и возвращать из этого метода объект LovesHumanRelation и тому подобное. А так получилась что называется анемичная модель.

    Но это всё можно быстро рассказать такому кандидату, дать почитать соответствующие главы из книг и будет реально толковый специалист. С такими знаниями не то что джуны, даже те кто сеньорами себя мнят ничерта подобного не знают. Одни ифоделы приходят (if-else-if-else).

    Я так понял, для техлида то что ты написал получилось слишком сложно. Он походу хотел чтобы ты написал всё используя подход transaction script и готово, как это делают кнопкодавы.

    Для меня, человек который вас не нанял - кретин. Показать бы ему что к нам приходит на собеседования за 100к.
    Ответ написан
    1 комментарий
  • Как начать понимать ООП и программировать в этом стиле?

    @xfg
    Изучить слоистую архитектуру.

    Книга: Implementing domain-driven design

    Можно сразу начать с прочтения главы 4 "Архитектура" и подраздела "Слои" для общего понимания какие слои существуют и для чего. Далее можно более детально углубиться в каждый из слоев для детального понимания как устроен каждый из них.

    Примеры из книги: https://github.com/VaughnVernon/IDDD_Samples
    Ответ написан
    Комментировать
  • Как вы разрабатываете свои приложения?

    @xfg
    Я TDD использую. Без тестов совершенно не понимаю сделал задачу или еще нет и все вокруг кажется недоделанным. Здесь же поделил крупную задачу на ряд небольших, написал тесты, написал код и четко чувствуешь момент, когда можно переходить к следующей задаче. Но я не в релизе, поэтому я плохой пример, так как делаю потому что интересно сделать бесконечно масштабируемое full-websocket приложение с использованием 3d и слоистой архитектурой из всех этих умных книг по объектно-ориентированному программированию, а не потому что жажду миллиард. За это время уже сбился со счета сколько сменил фреймворков, баз данных и даже поменял язык в итоге. За это время успел родиться AngularJS (тот что 1.x) и умереть, а я все пишу :)
    Ответ написан
    1 комментарий
  • Как лучше обращаться с параметрами метода?

    @xfg
    Аргументировать довольно просто и даже сослаться на конкретные абзацы из книги Implementing domain-driven design, а именно, то что автор пишет про сервисы. Автор книги довольно четко рассказывает почему сервисы не должны обладать состоянием.

    У вас классический сервис и у вас проблема, только лишь потому, что вы впринципе неправильно подошли к проектированию вашего сервиса.

    В первую очередь вам нужно спроектировать интерфейс CalculatorInterface

    interface CalculatorInterface {
      public function calculate($products, $city);
    }


    Далее вам нужно создать две реализации этого интерфейса CdekCalculator и EmsCalculator

    class CdekCalculator implements CalculatorInterface {
      public function calculate($products, $city) {
         // реализация расчета через cdek
      }
    }
    
    class EmsCalculator implements CalculatorInterface {
      public function calculate($products, $city) {
        // реализация расчета через ems
      }
    }


    И теперь ваш класс доставки будет выглядеть таким образом

    class Delivery {
      private $calculator;
    
      public function __construct(CalculatorInterface $calculator) {
         $this->calculator = $calculator;
      }
      public function calculate($products, $city) {
        //тут ещё какая-то логика, которая определяет условия доставки, если она вообще возможна
        return $this->calculator->calculate($products, $city);
      }
    }


    Предмета спора больше нет. Вы просто передаете в класс Delivery нужную реализацию калькулятора. Код выше это псевдоязык, не php и вообще только базовая идея того, как это должно быть. У вас наверняка тут же возникнет вопрос, как вам тогда выводить все расчеты доставки в ваш UI. Но извините не могу написать за вас всё приложение.

    Это базовые вещи в объектно-ориентированном программировании. Называется полиморфизм подтипов. Без этих знаний невозможно писать хороший объектно-ориентированный код. Лучше оба придите к выводу, что вам срочно нужно почитать какие-нибудь книги об объектно-ориентированном программировании и начать с самых основ, что такое полиморфизм и в частности полиморфизм подтипов.

    Вообще protected/private методы и ветвления из условных конструкций - это практически всегда показатель спагетти-кода и первый звоночек, что вы пишете процедурный код используя ООП синтаксис. Вы придете к этому выводу если будете разрабатывать через TDD, а затем сможете нагуглить ваши предположения у других программистов.
    Ответ написан
    3 комментария
  • Как вы относитесь к использованию транзакций в Laravel?

    @xfg
    Транзакции повторяют из-за дедлоков. Это такое состояние, когда одновременно выполняются 2 транзакции и первая транзакция блокирует запись, которая нужна второй транзакции, а вторая транзакция блокирует запись, которая нужна первой транзакции. В итоге ни одна из транзакций не может завершиться. Это состояние называется deadlock. В этом случае одна из транзакций должна откатиться, чтобы другая имела возможность успешно завершиться. Так вот, эта транзакция, которую откатили попробует еще 3 раза выполниться, прежде чем окончательно вылетит с исключением.

    Соответственно, да, если у вас толстые транзакции, то желательно их повторять, так как чем более жирная транзакция и чем больше выполняется одновременных транзакций в единицу времени, тем выше шанс получить deadlock.

    Вообще на более продвинутом уровне принято сохранять не более одной сущности (объекта) внутри одной транзакции. Таким образом вы получаете худые транзакции и отсутствие дедлоков. Производительность вашего приложения возрастет, но вместе с тем, вы получите проблему атомарного сохранения нескольких сущностей (объектов) в рамках одной бизнес-операции как это происходит в микросервисной архитектуре. Проблему можно решить использованием шаблона saga, но в целом это уже совершенно иной уровень знаний и вникать в это наверное не стоит, если вы делаете что-то небольшое.
    Ответ написан
    4 комментария
  • Правильно ли использовать Web Socket PHP для онлайн игры на unity?

    @xfg
    Да, экшены так и делают. Сервер может отправлять около 20 снепшотов игрового состояния на клиент, то есть приблизительно каждые 50 миллисекунд. Чтобы изображение не дергалось отображение игрового состояния смешают назад в прошлое скажем на 50 миллисекунд, а клиент таким образом имеет возможность интерполировать перемещение игроков и анимации между текущим и предыдущим состоянием. Соответственно и сервер должен рассчитывать ввод пользователя в прошлом учитывая это смещение на 50 миллисекунд, учитывая время на путешествие пакета от клиента до сервера и возможно что-то еще, чтобы сделать стрельбу или маханием мечем максимально точным.

    Для пошаговой игры это избыточно. Там достаточно просто отправлять новое состояние с сервера только в ответ на ввод пользователя.

    Другой вопрос стоит ли для этого использовать websocket php, когда насколько мне известно unity итак предоставляет возможности для организации мультиплеера.
    Ответ написан
    Комментировать
  • Зачем использовать реляционные субд для этой ситуации?

    @xfg
    Если комментариев к статье неограниченное количество, то хранить данные таким образом - неудачная идея. В mongodb документ по умолчанию не может превышать более 16 mb, но даже при отсутствии подобного ограничения, это привело бы к единовременному считыванию большого объема данных в память. В таком случае данные следует моделировать также, как и в РСУБД.

    Есть CAP-теорема и выбирать тип базы данных нужно исходя из того, какие 2 из 3 свойств для вас важнее. РСУБД дают согласованность и доступность (CA), но жертвуют возможностью разделения такой базы, nosql решения идут другим путем и жертвуют согласованностью в пользу доступности и устойчивости к разделению (AP). Согласованность данных в таких системах достигается при помощи шаблона Saga вместо ACID.

    В целом NoSQL это про проекты данные которых не помещаются в рамках одного сервера, а не про то, каким образом моделировать эти данные. Вложенные документы в mongodb - это скорее следствие её архитектуры, которое используют как маркетинговый ход, чем решение, которое будет использоваться повсеместно. В подавляющем большинстве случаев документы будут ссылаться друг на друга, точно также как это происходит и в РСУБД.

    Для проекта с крохотными объемами данных логичнее выбирать РСУБД и тем самым значительно упростить себе жизнь. Но в целом как используют NoSQL, шардируют данные и как достигают согласованности данных при отсутствии ACID знать желательно, хотя бы в общих чертах.

    Самое ужасное, это выбрать базу данных и использовать её неправильно, как пример документа с вложенными комментариями при условии их бесконечности в mongodb. Пишем скрипт генерирующий триллион комментариев к статье, а затем просим нам выдать эту статью и сайт уходит в офф. Хорошо что в mongodb есть защита от дурака.
    Ответ написан
    1 комментарий
  • Уступает ли SPA-приложение традиционным сайтам с точки зрения SEO?

    @xfg
    Современные поисковые системы умеют индексировать javascript сайты. Можно почитать более подробно об эксперименте. SSR и прочие хаки более не требуются.
    Ответ написан
  • Зачем нужены Gulp/Webpack?

    @xfg
    Webpack - это сборщик модулей, который позволяет писать модульный код, где каждый модуль имеет возможность импортировать различные зависимости, начиная от других модулей, до css стилей и изображений. На главной странице сайта даже есть пример, вы подаете на вход "модули с зависимостями", а на выходе получаете то, что сможет работать в браузере.

    Webpack - это просто крайняя точка развития идеи самовызывающихся функций, с помощью которых пытались решить проблему загрязнения глобальной области видимости, когда каждый скрипт подключенный к странице мог свободно обращаться к любым переменным и функциям из других скриптов, что приводило к различным проблемам, вроде случайного переопределения переменных, неявных зависимостей и необходимости строгой последовательности подключения скриптов. Эта идея затем переросла в requirejs, затем в browserify и вот в наши дни - webpack/rollup/parcel. Webpack анализирует зависимости, которые вы подключаете в вашем коде и собирает из этого конечный bundle, который сможет работать в браузере.

    Gulp - это менеджер задач для автоматизации различных рутинных операций, таких как минификация, тестирование, объединение файлов и тому подобное. Gulp в отличии от Webpack никак не анализирует ваш код. Он вообще ничего не делает и по-сути своей бесполезен.

    Gulp - это набор оберток-плагинов над различными утилитами. Это ведет к ряду проблем - плагины перестают поддерживаться разработчиками, плагины ломаются при очередном мажорном релизе Gulp, плагины не позволяют вам использовать новую версию утилиты, до тех пор, пока разработчик плагина не выпустит новую версию плагина совместимую с новой версией утилиты. Инструмент, который изначально возник, чтобы помочь решать возникающие проблемы, сам превратился в проблему. Это всё привело к тому, что от Gulp стали отказываться в пользу чистых утилит, которые теперь запускают через npm скрипты. Если посмотрите любые популярные open-source библиотеки, например bootstrap, то сможете заметить, что в 3 версии был Gulp, в 4 версии его не стало. Использовать Gulp сегодня не имеет смысла. Идея Gulp/Grunt - умерла, так как идея оберток-плагинов не принесла ничего, кроме дополнительных проблем.
    Ответ написан
    Комментировать
  • Почему некоторые люди утврерждают что плохо использовать jQuery?

    @xfg
    jQuery - это про императивное программирование. jQuery - это про то "как" манипулировать dom элементами. Итог - смесь dom и бизнес-логики. Это невозможно разделить.

    Angular - это про декларативное программирование. В Angular мы не говорим "как", мы говорим "что" мы хотим сделать с dom и он делает это. Что позволяет отделить бизнес-логику от манипуляций с dom.

    Соответственно вся эта история не про jquery vs vanilla, а про императивное vs декларативное программирование для работы с dom. Большинство этого не понимает и спорят о jquery vs vanilla, хотя всё это одно и то же, до тех пор пока у вас не появляется какая-то штука, которая меняет парадигму работы с dom с императивного на декларативный. Внутри этой штуки можно использовать хоть vanilla, хоть jquery. Без этой штуки - у вас каша, хоть с vanilla, хоть с jquery.

    Собственно об этом написано в википедии:

    AngularJS is built on the belief that declarative programming should be used to create user interfaces and connect software components, while imperative programming is better suited to defining an application's business logic.


    Остальные фреймворки про то же самое. Это и стало причиной стремительного роста популярности javascript фреймворков.
    Ответ написан
    2 комментария
  • Бросать исключение или возвращать коды ошибок/успеха? Является ли исключением то, что метод не может выполнить свою задачу?

    @xfg
    Исключения и есть современный способ реакции программы на ошибки, которые приводят к бессмысленности дальнейшего её выполнения. Соответственно, если у пользователя недостаточно средств для перевода, дальнейшее выполнение программы не имеет смысла, необходимо прервать её выполнение выбросив исключение. Когда этого механизма не существовало использовали коды ошибок.

    Вы также всегда имеете возможность посмотреть популярные open-source решения и убедиться какой точки зрения придерживается сообщество.
    Ответ написан
    1 комментарий
  • "Удаление" агрегата в DDD?

    @xfg
    Идея у вас верная, только вместо защищенного onDelete, делают обычный публичный метод remove, который ничего не делает, а просто выбрасывает доменное событие. Этот метод как и все остальные просто вызывается внутри application сервиса, а затем удаляется из репозитория.


    $catalog->remove();
    $repository->remove($catalog);


    Чтобы была атомарность, нужно события выбрасывать после того, как изменения были сделаны в базе данных. Само событие нужно также в базу сохранять, в одной транзакции с созданием/обновлением/удалением данных об агрегате. Какая-то штука затем должна удалять обработанные события. Какая-то штука должна проталкивать события из базы, которые почему-то там уж слишком долго живут - подписчикам. Обычно происходит при сбое, когда в базу событие записалось, а подписчикам не отправилось.

    Какая-то сложная замороченная хрень с консистентностью по событию получается. Еще бывает, что тот кто принял событие не может его обработать, так как нарушается какой-нибудь инвариант в его доменной модели и шлет событие о неудаче, на которую должен отреагировать тот от кого пришло событие этому. Больше трех шагов и совершенно непонятно, какие события куда летают, кто на них реагирует и что вообще происходит в такой системе.

    Поэтому я бы попробовал Saga Orchestration, это такая штука, в которой пошагово описывается какие сервисы нужно вызвать, чтобы успешно завершить бизнес-операцию, а также какие действия нужно выполнить на каждом шаге в случае сбоя одного из сервисов участвующих в бизнес-операции для того, чтобы вернуть всю систему в консистентное состояние.
    Ответ написан
    2 комментария
  • В чем разница между 'фабричным методом' и 'простой фабрикой'?

    @xfg
    Фабричный метод

    Фабричный метод позволяет избавить клиента от необходимости знать о процессе создания конкретных объектов. Клиент зависит только от интерфейса фабричного метода. Клиент используя фабричный метод может создавать и работать с любым объектом реализующим интерфейс IMobile.

    Простая фабрика

    Строго говоря в GoF нет такого паттерна как "простая фабрика". Но тем не менее это откуда-то пошло и подобный кусок кода стали называть "простой фабрикой", об этом есть упоминание в википедии и что в это можно инкапсулировать сложный процесс создания объекта, например когда он зависит от настроек в конфигурационном файле или от пользовательского ввода.

    Я не вижу паттерн в простой фабрике. Я вижу лапшу из операторов ветвления. Вместо этого пользовательский ввод или настройки конфига можно напрямую без свалки из операторов ветвления сконвертировать в имя требуемого класса фабричного метода и уже его объект передавать клиенту таким образом избавившись от спагетти-кода в виде "простой фабрики".

    Невозможно сказать кто придумал "простую фабрику" и зачем. То, что в ней написано, это спагетти-код. То, что в ней написано, можно решить более элегантным способом без свалки из операторов ветвления.
    Ответ написан
    5 комментариев
  • Как изучать node js в 2019м?

    @xfg
    Node.js не изучают. Это не язык. Здесь не учат как определить переменную или вызвать функцию. Это набор модулей, которые рассматривают как пользовательские javascript объекты. Открывают api документацию по модулю, смотрят, что делают его методы и используют в своей программе если это требуется.

    Для работы с платформой достаточно прочитать руководство.

    Лучше переключить своё внимание на английский язык.
    Ответ написан
    Комментировать
  • Самый простой способ реализовать real time MySQL (без firebase!) базу данных для маленького приложения?

    @xfg
    Базу данных можно выбрать любую. Она не играет роли в realtime приложениях. Позвольте вам немного объяснить. Для передачи данных между клиентом и сервером в браузере существует всего два протокола. HTTP и Websocket. Firebase не магия и также использует их. Если браузером не поддерживается Websocket, то firebase откатывается на HTTP. Используя общераспространенный подход к разработке на PHP у вас не получится использовать websocket протокол поскольку типичные PHP приложения не живут дольше 1 запроса. Соответственно да, в таком варианте остается только ajax. Но точно также работает и firebase если в браузере нет поддержки websocket, так работает facebook, telegram и много всего остального. Они используют long-polling. Клиент отправляет запрос к скрипту на сервер, скрипт в цикле опрашивает хранилище mysql или более продвинутый вариант mysql+redis (чтобы не грузить запросами mysql) и пока данных не будет, цикл так и продолжит крутиться, для клиента это просто выглядит как повисший запрос к серверу. Как только данные появляются, они отправляются на клиент, соединение разрывается, а клиент сразу же отправляет новый запрос.

    Есть развитие этой идеи. Называется HTTP Streaming. Отличие от long-polling в том, что после отправки данных клиенту соединение не разрывается, а сервер продолжает отправлять последующие данные по этому же соединению. Соединение разрывается по таймауту. Минус в том, что прокси-сервера могут кешировать небольшие пакеты данных и данные нужно раздувать например пробелами, чтобы пакет данных достигал минимального размера и был способен пробить кеш прокси-сервера. Плюс в том, что если у вас данные для клиента появляются скажем с переодичностью раз в секунду, то не будет происходить постоянного открытия-закрытия соединения как при long-polling.

    Есть вариант, когда можно реализовать небольшую прослойку на socket.io. Ваше PHP приложение пишет данные для клиента например в redis. Приложение на socket.io подписывается на redis. Когда PHP что-то отправляет в redis, то socket.io мгновенно об этом узнает и рассылает это событие по websocket протоколу всем подключенным клиентам. Минусы. Раздуваете стек. Нет консистентности данных между записью в основное хранилище (mysql/postgre/mongo/etc) и redis. Соответственно может возникнуть ситуация, когда данные записали, но в redis событие не ушло. Поменяете местами, будет наоборот, событие есть, данных в базе нет.

    Вариантов в целом очень много. Всё это называется Comet. Вам проще всего реализовать long-polling.

    А реал-тайм база, которая умела пушить данные клиенту по tcp протоколу (но не в браузер) была и называлась она rethinkdb.com. Ныне не развивается. IP в России заблокирован. На сайт можно сходить по VPN.
    Ответ написан
    3 комментария
  • Сложно ли создавать 3D игры, какие знания нужны для создания 3D игр?

    @xfg
    Знание линейной алгебры. Это первый курс технического вуза. Если каждую точку (представленную вектором) 3D модели умножить на одну и ту же матрицу, то все точки переместятся в другое местоположение относительно центра, но с пропорциональным сохранением расстояния между друг другом. Соответственно были вычислены матрицы преобразования, которые дают эффект перемещения, масштабирования и поворота точки в пространстве. Можно почитать о матрицах преобразований и самому порешать примеры, чтобы удостовериться, что они действительно дают нужный эффект. Далее это умножают на матрицу перспективы, таким образом создавая эффект отображения изображения в перспективе. Делают это на языке программирования GLSL. Пишут вершинный шейдер, который на вход принимает текущее положение каждой вершины, а также матрицы модели и перспективы, перемножая это всё в нужном порядке на выходе получается новое местоположение вершины. Далее результат передается в фрагментный шейдер, где каждый пиксель между этими вершинами раскрашивается в нужный цвет. Свет, тени и прочее, так же считают в фрагментном шейдере. Получившееся изображение выводится на экран.

    Можете посмотреть видео по теме https://www.youtube.com/watch?v=HLbxyPwdlgI&list=P...
    Ответ написан
    Комментировать
  • Как отправить сообщение в вебсокет распределенной системы?

    @xfg
    Необходимо так или иначе реализовать механизм pub/sub. Например через redis. Все сервера подписываются на redis канал. Кто-то из серверов публикует сообщение в redis-канал. Все сервера получают сообщение и дальше рассылают своим вебсокет-клиентам.

    Подобную реализацию для библиотеки socket.io можно посмотреть здесь/
    Ответ написан
    Комментировать