• Как работают алгоритмы выбора лидера в распределенных системах?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Можно же просто сделать так - какой-нибудь узел заметил, что текущий лидер отвалился, и он сразу же отправляет всем остальным узлам напрямую, либо на какую-то шину, что теперь он - лидер.

    Если текущий лидер отваливается, почему вы думаете, что все остальные узлы узнают об этом по очереди?
    Узнают одновременно. И одновременно пошлют всем узлам, что они новые лидеры, и получится бардак.
    Именно поэтому и проводится выбор - либо генерируется случайное число каждым узлом, и выбирается среди всех тот, у кого число самое большое. Либо есть заранее заданные приоритеты выбора лидеров, основанные или на конфигах, или на мощностях, как уж создателю программы показалось нужным.
    Опять же, в алгоритм можно добавить настройки, чтобы администратор мог указать какие машины не должны участвовать в выборе.
    Ответ написан
    2 комментария
  • Как сделать большую картинку opengraph в телеграм?

    @Khech
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:image" content="{IMAGE URL}" />


    Как ни странно, в этой задаче помогают теги для Twitter
    Ответ написан
    6 комментариев
  • Какой факультет выбрать?

    @Evsign
    Однозначно либо "Прикладная математика и информатика", либо "Программная инженерия".
    Только не забывай, что помимо этого все равно придётся очень много развиваться самостоятельно, если хочешь стать программистом.
    Ответ написан
    Комментировать
  • Как прочитать варианты клетки-дропдауна из Excel-таблицы?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Возможно, информация по ссылке будет полезна для вас. Тут ответ на аналогичный вопрос:
    (обратите внимание на оба ответа)
    https://stackoverflow.com/questions/21181551/read-...

    Также по теме:
    https://stackoverflow.com/questions/51017694/apach...
    Ответ написан
    Комментировать
  • Чем сеанс отличается от сессии?

    Sanasol
    @Sanasol Куратор тега Веб-разработка
    нельзя просто так взять и загуглить ошибку
    1 комментарий
  • Как скрыть роут метрик Prometheus?

    alfss
    @alfss
    https://career.habr.com/alfss
    Настроить ингресс.
    Выделить отдельный порт.
    Ответ написан
    Комментировать
  • Как скрыть роут метрик Prometheus?

    @ghostiam
    На Go писатель, серверов пинатель.
    Вы можете изменить путь до ендпоинта с метриками, включить авторизациию или ограничить получение данных по IP сервера с Prometheus

    Для смены пути или авторизации, смотрите документацию к конфигам Prometheus
    https://prometheus.io/docs/prometheus/latest/confi...
    Ответ написан
    Комментировать
  • PHP cURL get запрос?

    alekciy
    @alekciy
    Вёбных дел мастер
    У GET запроса не должно быть тела.
    Ответ написан
  • Архитектура highload websocket проекта?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Из-за особенностей работы сборщика мусора в Go у вас скорее всего возникнут проблемы, если ключи в map'е содержат указатели (включая структуры их содержащие).

    Вот накидал способ хранения сокетов немного в другом виде без указателей в ключах:
    const n = 4 // длина идентификатора комнаты в байтах
    type (
    	noop struct{}
    	WebSocket struct{} // сокет
    
    	Sockets []WebSocket
    	RoomKey [n]byte
    	
    	Index uint32
    
    	Room map[Index] struct{}
    	Rooms map[RoomKey] Room
    )
    
    var sockets = make(Sockets, 0, 2000000)
    var rooms = make(Rooms, 1000)
    var lastSocketRoomKey RoomKey
    
    func insert(ws WebSocket, rk RoomKey){
    	room, _ := rooms[rk]
    	// тут создание комнаты, если ее нет
    	// ...
    	
    	sockets = append(sockets, ws)
    	
    	last := len(sockets) - 1
    	room[Index(last)] = noop{}
      
            // сохраним ключ комнаты последнего сокета
            // чтобы можно было исправить индекс при удалении
            copy(lastSocketRoomKey[:], rk[:])
    }
    
    func remove(i Index, rk RoomKey){
    	// удаляем сокет,
    	// переместив последний в массиве на место удаляемого
    
    	last := len(sockets) - 1
    	sockets[i] = sockets[last]
    	sockets = sockets[:last]
    
    	// удаляем сокет из комнаты
    	room, _ := rooms[rk]
    	delete(room, Index(i))
    
    	// чиним индекс перемещенного сокета
    	roomOfLast := rooms[lastSocketRoomKey]
    	delete(roomOfLast, Index(last))
    	roomOfLast[Index(i)] = noop{}
    }


    Когда вам нужно разослать сообщения, в моем примере доступ к сокету будет происходить примерно так:
    for _, index := range rooms[roomkey]{
         // sockets[index] -- сокет в комнате с roomkey
         
        // т.к. из-за особенности структуры искать сокет в комнате получается невыгодно долго, 
        // придется удалять закрытые сокеты "ленивым" способом во время рассылки, 
        // либо заполнять массив индексов и после уже удалять эти сокеты из общего хранилища
        // функцией remove(index, roomkey)
    }


    Очевидно, что в данном примере доступ к sockets и rooms не должен происходить из разных горутин.
    Ответ написан
    Комментировать
  • Почему закрывается соединение по webscoket?

    @Nube Автор вопроса
    Решение оказалось простым), нужно заменить log.Fatal(err) на log.Println(err) или на что нить другое. Каждый раз когда перезагружается страница соединение по websocket закрывается, поэтому websocket: close 1001 (going away). это норма ).
    Ответ написан
    Комментировать
  • Парсинг json в go?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Комментировать
  • БД для хранения сообщений чата, какую выбрать?

    @InoMono
    Вполне себе любая развитая современная РСУБД годится для этой задачи.
    MySQL, PostgreSQL...

    А по мере роста нагрузки - тут не выбором СУБД нужно заморачиваться, а MQ-сервер ставить. Он гораздо легче сравиться с бешенными нагрузками.

    Как вариант - Queue на базе Tarantool, например. Я даже не знаю что вы там должны такое сделать, чтобы заткнуть его производительность. При условии того, что на сервере достаточно много оперативной памяти.

    Из самого критично подозрительного - полнотекстовый поиск.
    Впрочем, полагаю, что полнотекстового поиска средствами MySQL или PostgreSQL вплоне хватит.

    Если уж делать прям таки серьезный чат типа Slack, то для полнотекстового поиска я бы вообще отдельную специализированную БД держал бы. Например, SphinxSearch.

    Но, для начала, возможностей PostgreSQL или MySQL будет вполне достаточно.

    Что до Mongo... Если вам не нужна репликация без консистентности. Зато быстрая...
    Так вот если вам не нужна такая репликация, то Монга вам не нужна.

    РСУБД будут существенно быстрее.

    Вот ежели вы планируете заводить ваш чат в кластер, когда одного сервера вам не хватит, то тут да, тут РСУБД не лучший выбор. Тут бы я рекомендовал как раз Монгу.
    Но опять таки кластер серверов для чата вы без MQ не сделайте.

    Вывод:

    Начните с обычной РСУБД.
    Как начнутся затыки - рассмотрите MQ
    Как начнется рост до масштаба планеты - рассматрите Монгу.

    Вся система работает с бд MySQL - InnoDB, сообщения пишутся в бд при каждой отправке (INSERT), пока сервис еще не запущен, сообщений мало (только мои тестовые) все работает шустро, но вот когда запущу и количество сообщений перевалит за несколько миллионов, что будет тогда с моей бд? Начнутся жесткие тормоза при select и insert?


    Вам никто не мешает это проверить.
    Сгенерируйте миллион случайных сообщений.

    При грамотном использовании индексов - ровным счетом никаких проблем ни на миллионах ни на миллиардах записей.
    Ответ написан
    15 комментариев
  • Построение запроса INET_ATON?

    DevMan
    @DevMan
    SELECT * FROM `ips` WHERE INET_NTOA(`ip`) LIKE '127.0%';
    Ответ написан
    1 комментарий
  • Построение запроса INET_ATON?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    SELECT * FROM `ips` WHERE INET_NTOA(ip) LIKE '127.0%'
    Ответ написан
    1 комментарий
  • Как имитировать пользователя на сайте?

    blood-moon
    @blood-moon
    Фрилансер
    Был небольшой опыт в подобном .
    Нужно было авторизоваться на сайте и ставить опр. странице 5 баллов (там рейтинги опр. были) . Вообщем моих очень скудных знаний в c# вполне хватило . Просто авторизация аля POST запрос , потом ещё GET переход на нужную страницу и снова POST (ставлю 5 баллов) . Вообщем это был бот по накрутки рейтинга ... если нужно могу поискать исходники .
    Ответ написан
    Комментировать
  • Как обработать ассоциативный массив так, чтобы сформировать массив значений?

    DevMan
    @DevMan
    ну тут и понаписывали...
    это решается одной функцией https://secure.php.net/manual/ru/function.array-co...
    Ответ написан
    Комментировать
  • Как проинспектировать архив на PHP?

    DevMan
    @DevMan
    $za = new ZipArchive(); 
    $za->open('/path/to/your.zip'); 
    
    for( $i = 0; $i < $za->numFiles; $i++ ){ 
    	$stat = $za->statIndex( $i ); 
    	echo $stat['name'], PHP_EOL; 
    }
    как раскидать файлы по папкам в массиве предлагаю подумать самому.
    Ответ написан
    5 комментариев