Задать вопрос
  • Как составить наиболее эффективный алгоритм групповой рассылки сообщений по каналам WebSocket?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вам по-любому придется отправить сообщение каждому пользователю, кто онлайн и подписан на канал.

    Единственное, что вы можете соптимизировать - это нахождение списка пользователей.

    Вам надо как-то побыстрее определить, какие пользователи сейчас онлайн из данного канала. Можно или поддерживать эту информацию в памяти (это будет map из channel_id в set user_id). Когда пользователь выходит в онлайн, надо добавить его в структуру данных для всех каналов, на которые он подписан. Когда пользователь отваливается - удаляйте его из памяти и чистите структуру (надо удалить ключ из map, если там значение осталось пустым).

    Еще вариант: сделать это прямо в базе данных. Для каждого пользователя поддерживайте флаг - онлайн ли он. И в базе данных спрашивайте список всех онлайн пользователей, которые подписаны на нужный канал. Можно даже ваш map user_id->socket_channel_id в базу запихать.
    Ответ написан
    Комментировать
  • Как составить наиболее эффективный алгоритм групповой рассылки сообщений по каналам WebSocket?

    @calculator212
    Ведь соединений может быть как 2 так и 1_000_000+, что уже будет плохо и перебор всех элементов такой Map на каждом создание сообщения будет не очень хорошо сказываться, а так же, в примере это групповой канал, который может содержать так же от до 2 до бесконечного числа пользователей.

    В общем это вполне рабочая ситуация. Mail ru делали что-то похожее и для таких ситуаций написали свою либу для работы с вебсокетами, тут статья, также вроде у них было еще видео на highload, где также объясняли проблемы и пути решения
    Ответ написан
    2 комментария
  • Как составить наиболее эффективный алгоритм групповой рассылки сообщений по каналам WebSocket?

    @rPman
    У тебя сервер хранит все открытые сокеты клиентов, по той же логике, как оптимизируют загрузку файлов в несколько потоков, сделай и рассылку. Создай пул воркеров, создай очередь на отправку сообщений, воркер по завершению отсылки будет брать следующее сообщение на отправку.

    Такой подход позволит реализовать воркеров на нескольких нодах, мало того, можно сразу очереди по какому то правилу (хеш от id например, но это фиксирует количество нод, для смены придется весь кластер перезапускать) раскидывать между нодами, тогда и синхронизацией очередей между нодами не нужно заморачиваться.
    Ответ написан
    Комментировать
  • Стоит ли делать отдельный микросервис для Баз данных?

    @Everything_is_bad
    Нам нечего тут чего-то конкретного посоветовать, мы вообще ничего не знаем про систему. Ну и сразу, микросервисы выделяются по сущностям системы, а не по инструментам. Так же у вас должен быть архитектор, который однозначно скажет, нужно ли вам именно такое решение.
    Ответ написан
    Комментировать
  • Стоит ли делать отдельный микросервис для Баз данных?

    @alexalexes
    Без подробностей связей архитектуры и метрик взаимодействий подсистем это останется мнением, а не основанием перехода на новую архитектуру.
    Ответ написан
    Комментировать
  • Как крупные веб сервисы хранят массивы данных?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Так же как и все - в БД плюс специальные архитектурные решения. Для разных типов данных используются различные механизмы доступа - все зависит от того, что и как использует эти данные. Там на самом деле куча различных как программных решений и систем, так и железных - типа специальных БД, нескольких уровней кэширования на SSD/RAM и прочего.

    как подобные сервизы хранят большие объёмы данных привязанные к единому элементу, например в канале находятся несколько сотен или даже тысяч пользователей

    Точно так же как и в более простых случаях - по ID в реляционных БД и в иерархии в иерархических БД, например. Для межсистемного взаимодействия используется специальный ID для передачи его между разными API.

    Какой в целом предпочтительный способ хранения подобного вида информацию

    Зависит от конкретных требований в конкретном случае. Горячие данные - в кэше, холодные - на диске. И т.п.
    Ответ написан
    Комментировать
  • Как перенести контейнер Docker на другую машину?

    gohdan
    @gohdan
    Системный администратор
    Если нужно перенести прямо контейнер как есть, то есть команда docker save, она позволяет сохранить текущую файловую систему хранилища в tar-архив. Потом на другой машине можно сделать docker load этого архива, он подгрузится как docker image. На базе этого docker image можно запустить другой контейнер. Параметры запуска можно взять из docker inspect старого контейнера.

    Но, как уже написали выше, это плохое решение для плохой ситуации. Не надо держать в контейнерах базы данных и конфиги, они должны лежать отдельно на файловой системе хоста, тогда можно просто остановить контейнер, всё это скопировать на другую машину и там запустить контейнер аналогично старому.
    Ответ написан
    Комментировать
  • Как получить удалённый доступ к http контейнеру?

    2ord
    @2ord
    Есть способ, который подходит только временно. Не для продакшена.
    С агентом Ngrok (обычно доступен в репозиториях) или его альтернативами:
    агент запускается локально и создает тоннель на локально работающий веб-сервер или другой сервис, работающий на определенном порту.
    Контейнер Докера должен пробросить порт приложения. Скажем, порт 3000.
    spoiler

    NAME:
      ngrok - tunnel local ports to public URLs and inspect traffic
    
    USAGE:
      ngrok [command] [flags]
    
    DESCRIPTION: 
      ngrok exposes local networked services behinds NATs and firewalls to the
      public internet over a secure tunnel. Share local websites, build/test
      webhook consumers and self-host personal services.
      Detailed help for each command is available with 'ngrok help <command>'.
      Open http://localhost:4040 for ngrok's web interface to inspect traffic.
    
    Author:
      ngrok - <support@ngrok.com>
    
    TERMS OF SERVICE: https://ngrok.com/tos
    
    EXAMPLES: 
      ngrok http 80                           # secure public URL for port 80 web server
      ngrok http --domain baz.ngrok.dev 8080  # port 8080 available at baz.ngrok.dev
      ngrok http foo.dev:80                   # tunnel to host:port instead of localhost
      ngrok http https://localhost            # expose a local https server
      ngrok tcp 22                            # tunnel arbitrary TCP traffic to port 22
      ngrok tls --domain=foo.com 443          # TLS traffic for foo.com to port 443
      ngrok start foo bar baz                 # start tunnels from the configuration file
    
    COMMANDS:
      api                            use ngrok agent as an api client
      completion                     generates shell completion code for bash or zsh
      config                         update or migrate ngrok's configuration file
      credits                        prints author and licensing information
      diagnose                       diagnose connection issues
      help                           Help about any command
      http                           start an HTTP tunnel
      service                        run and control an ngrok service on a target operating system
      start                          start tunnels by name from the configuration file
      tcp                            start a TCP tunnel
      tls                            start a TLS tunnel
      tunnel                         start a tunnel for use with a tunnel-group backend
      update                         update ngrok to the latest version
      version                        print the version string
    
    OPTIONS:
          --config strings    path to config files; they are merged if multiple
      -h, --help              help for ngrok
          --metadata string   opaque user-defined metadata for the tunnel session
      -v, --version           version for ngrok

    Ответ написан
    Комментировать
  • Как избавиться от требования обработки исключения в Project Reactor?

    Vamp
    @Vamp
    неужели есть только один вариант это обрабатывать с поощью try/catch внутри каждого блока что бы избежать Unhandled exceptions?

    Вобщем-то да. Можно вынести try/catch в отдельный универсальный метод, который оборачивает исключение в RuntimeException:

    private @NotNull Mono<JsonObject> invoke(Channel channel, Class<?> clazz, Method method, Object... args) {
        return Mono.fromCallable(() -> clazz.getDeclaredConstructor(Server.class, Channel.class))
            .map(constructor -> ex(() -> constructor.newInstance(this.manager.getServer(), channel)))
            .flatMap(obj -> new GenericData<JsonObject>().invoke(method, obj, args))
            .onErrorResume(Mono::error);
    }
    
    private <T> T ex(Callable<T> code) {
        try {
            return code.call();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    Конкретно в вашем примере можно вызов конструктора переместить в callable, из которого делается Mono, так как из Callable разрешено стрелять проверяемыми исключениями, в отличии от Function, который принимает map:

    private @NotNull Mono<JsonObject> invoke(Channel channel, Class<?> clazz, Method method, Object... args) {
        return Mono.fromCallable(() -> {
                var constructor = clazz.getDeclaredConstructor(Server.class, Channel.class);
                return constructor.newInstance(this.manager.getServer(), channel);
            })
            .flatMap(obj -> new GenericData<JsonObject>().invoke(method, obj, args))
            .onErrorResume(Mono::error);
    }
    Ответ написан
    Комментировать
  • Как решить проблему с цикличным получением записей таблицы SQL?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    ResultSet содержит так называемый курсор, который позиционируется на текущей строке данных. При вызове метода next, курсор перемещается на следующую строку.
    Т.е. в методе getValues вы ходите по строкам, а не по столбцам.
    Ответ написан
    Комментировать
  • Как убрать запуск скрипта при запуске windows 11?

    saboteur_kiev
    @saboteur_kiev Куратор тега Windows
    software engineer
    скачай autoruns.exe из sysinternals tools на сайте майкрософт и через него смотри ВСЕ что в разных местах автозапуска у тебя есть.
    Ответ написан
    1 комментарий
  • Как правильно построить бесконечное соединение?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Могу предположить что речь идёт о сокетах.
    Ответ написан
    Комментировать
  • Как можно считывать все запросы отправленные в базу данных с момента её создания?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    А как получить ежедневные подробные фотографии строительства дома, в котором вы живёте? Ведь если его строили, и фото можно было делать - значит фото есть!

    Вот ваш вопрос построен по этому же принципу "дайте мне то, что я захотел". Но никто не настраивал базу данных на хранение запросов, как никто не посылал фотографов к будущему зданию.
    Ответ написан
    Комментировать
  • Как можно считывать все запросы отправленные в базу данных с момента её создания?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Никак. База данных не хранит запросы. Она хранит журнал транзакций (если его не очищали, то с момента создания) — это фактически журнал изменения данных. В разных СУБД есть свои методы чтения этого журнала.
    Ответ написан
    Комментировать
  • Как вывести список подключенных библиотек к проекту?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Джава ничего не знает о системах сборки. В джава есть пакеты. Где они конкретно лежат джава не знает.
    Можно попробовать парсить classpath, но я бы на это не поставил.
    Парсить можно примерно так:
    ClassLoader cl = ClassLoader.getSystemClassLoader();
    
            URL[] urls = ((URLClassLoader)cl).getURLs();
    
            for(URL url: urls){
            	System.out.println(url.getFile());
            }
    Ответ написан
    Комментировать
  • Как передать данные с клавиатуры в параметры экземпляра класса?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Модульные тесты не должны взаимодействовать с внешним миром.
    Ответ написан
    Комментировать