• Из чего создать домашнюю сеть с центральным сервером и терминалами?

    pindschik
    @pindschik
    ФЫВА ОЛДЖ
    С пробросом видеокарты в терминальную сессию Windows ничего не выйдет. Во всяком случае в разумную стоимость. Идею поиграть с любого слабого г... или с работы - на своем уютном домашнем сервачке придется забыть.
    Ну так задумано магнатами железа и софта. Это решение за отдельные деньги.
    С остальным проблем не будет.
    Если хочется смотреть видосики в терминале - то нужен 4-х ядерный проц в сервере. Пережатие видео перед отправкой пойдет в лоб, через боль.
    С балконом будут проблемы зимой (мороз). С застекленной лоджией будут проблемы летом (жара). Лучшее место - уличный холодильник под окном кухни (если имеется), с забором воздуха с улицы.
    Ответ написан
    Комментировать
  • Из чего создать домашнюю сеть с центральным сервером и терминалами?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    "Пап, а инопланетяне бывают? - Нет, сынок, это фантастика..." (С) Реклама

    Вы хотите не то, чтобы невозможного, но фантастически дорогого решения. Виртуализация с возможностью полноценного 3D возможна. Но чрезвычайно дорога - карты, подобные Nvidia K1/K2 GRID стоят сотни тысяч рублей, а на других полноценная удаленная виртуализация невозможна. Готовы потратить пару сотен тысяч на одну видеокарту?

    Про VmWare, VirtualBox и WSL знаю, но это всё-таки полурешения со своими ограничениями

    Кроме VmWare, Hyper-V и KVM (libvirt + QEMU) - других гипервизоров первого типа (для bare-metal установки) - нет. VirtualBoх и WSL - это гипервизоры второго типа, они тут вообще ни при чем. Поэтому выбирать придется из этих трех.

    Сервер должен быть тихим.

    Шумит серверное железо из-за охлаждения. Охлаждение у него такое из-за формата корпуса. Берете башенный (не стоечный) корпус, набиваете его вентиляторами, которые не шумят.

    Час-другой крашу монстров в крутой шутер, после чего опять переподключаюсь к линуксу и продолжаю работать ровно с того состояния, в котором была работа до перерыва

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

    На терминале должна быть возможность играть в 3D игры. То есть он должен иметь высокопроизводительную (желательно сменную) графическую карту

    Терминалов с видеокартами не бывает - это либо терминал, либо машина с видеокартой

    Ну, а если предполагаемые затраты в сотни тысяч рублей Вас не пугают - проще к интегратору обратиться, за Ваши деньги любой каприз...
    Ответ написан
    Комментировать
  • Java+netty+kafka: как перейти от многопоточности к мультиплексированию?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Не работал с Kafka, но на сколько я знаю, она синхронная до безобразия. По крайней мере в вопросе подписки. В голову приходят два способа решить проблему интеграции с асинхронным Netty.

    Можно в инициализаторе конвейера или обработчике клиентского соединения запускать периодическую задачу, которая будет опрашивать очередь с нулевым таймаутом:
    eventLoop.schedule(() -> {
       ConsumerRecords<String, String> records = consumer.poll(Duration.ZERO);
       // Какие-либо действия
    }, 100, TimeUnit.MILLISECONDS);

    Но этот вариант обрушит на сервер Kafka шквал запросов.

    Другой вариант - это сделать костыль в виде дополнительной очереди, в которую отправлять сообщения о том, что в какой-либо из клиентских очередей появилось сообщение. Тогда можно в одном потоке заблокировать ожидание сообщений из этой очереди, а при получении порождать событие в цикле событий Netty:
    class MessageListener implements Runnable {
        private final ChannelGroup group;
        private volatile boolean run = true;
    
        public MessageListener(ChannelGroup group) {
            this.group = group;
        }
    
        public void run() {
            while(run) {
                ConsumerRecords<String, String> records = notificationConsumer.poll(Duration.ofSecond(5));
                if (!records.isEmpty())
                    group.forEach(c -> c.pipeline().fireUserEventTriggered(new NewMsgEvent()));
            }
        }
    
        public void stop() {
            run = false;
        }
    }

    class SomeHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
            if(evt instanceof NewMsgEvent) {
                ConsumerRecords<String, String> records = clientConsumer.poll(Duration.ZERO);
                records.forEach(record -> {
                    ctx.write(Unpooled.wrappedBuffer(record.value().getBytes(StandardCharsets.UTF_8)));
                });
                ctx.flush();
            }
            else {
                super.userEventTriggered(ctx, evt);
            }
        }
    }

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