1. C# / Говнокод #22776

    −40

    1. 1
    Сейчас подниму на сервер автоплюсатор новых постов, чтобы всякие дохуя умные их не топили

    Если он, конечно, работает
    Пока +47, завтра нарегаю еще стопицот учеток

    Запостил: cykablyad, 10 Апреля 2017

    Комментарии (98) RSS

    • Напесдел, +45
      Ответить
    • показать все, что скрытоНе пробуй даже.
      Ответить
    • Охуительно ты новый ГК пилишь.
      Ответить
      • Будет лол, если Страйкер его забанит вместо АнтиСпама.
        Ответить
      • Не прошло и недели, а новый гк меня уже заебал
        Я даже на гитхабе issue создал, а туда никто не пишет
        Ответить
        • > новый гк меня уже заебал
          Собственно, предсказуемо. Плавали, знаем. Если ты не готов смириться, что всём насрать, пока всё не готово (и даже после того, как всё готово), то лучше и не начинать.
          Ответить
          • Ну блять
            Ответить
            • Да. Мы только будем наблюдать за процессом из-за угла и высказывать замечания.
              Доведём Вас до слёз. Потому, что для нас это просто сайт, а не любимое творение.
              Ответить
            • Почему, думаешь, Страйко забил?
              Ответить
              • показать все, что скрытоПотому, что сайт не рассчитан на долбоёбов.
                На другом ресурсе будет точно то же самое - вспомните ещё мои слова.
                Ответить
                • Вот у Василия на форуме было тихо. Ботов он вовремя банил, багры вилкой чистил.
                  Ответить
                  • показать все, что скрытоиВасилий был неплохим человеком. Мне очень не хватает его, хоть он и минусовал меня. Проблема в том, что он работал над вопросом слишком усердно. В результате погорел.
                    Ответить
          • > то лучше и не начинать
            Оффтопик по СУБД.

            Есть табличка, в которую писатели накидывают новые записи. Есть читатели, которые хотят видеть новые записи и делают запрос в духе id > last_known_id.

            Есть ли какой-то более адекватный способ, чем тотальная сериализация всех писателей об одну лочку?
            Ответить
            • показать все, что скрытоПерепилил твой CLang, проверь.
              Ответить
            • показать все, что скрытозачем их сериалайзить? писатели держут райтлок, а читатели берут ридлок
              их можно сто штук набрать же
              Ответить
            • тебя смущает тот кейс, что писатель А хочет заинсертить строку с id = 4, а писатель Б - с id = 5, и так случилось, что транзакция Б закоммитилась раньше транзакции А, и есть ненулевой шанс, что читатель с last_known_id = 3 может попасть на именно такой момент и проебать существование записи с id = 4, увидев только запись 5?
              Ответить
              • показать все, что скрытос чего писатель Б запишет 5?
                откуда он знает что 4 уже записали, если транзакиця 4 еще не закоммичена?
                Ответить
                • Sequence, из которого дёргаются номера для авто-инкрементных полей, как правило не транзакционный, а просто атомарный. Иначе пирфоманс просядет - транзакции не смогут параллельно втыкать записи.

                  Поэтому одна транзакция возьмёт себе 4, а вторая - 5. И обе из них пойдут долелывать какие-то ещё вставки/обновления. И в каком порядке они закоммитятся - никто не знает.
                  Ответить
                  • З.Ы. Прекрасно воспроизводится даже на уровне изоляции serializable :) Где теперь твой бог?
                    Ответить
                  • >>как правило не транзакционный, а просто атомарный. И
                    ну так ты субд на хуйю провернул, и конечно всё не работает.

                    делай нормальную транзацию
                    1) взял
                    2) увеличил
                    3) записал
                    Ответить
                    • я тебя минуснул, потому что ты на хую провернул конкурентность, сделав субд в этом месте однопоточной

                      ничем не отличается от
                      > тотальная сериализация всех писателей об одну лочку
                      на уровне бека
                      Ответить
                      • Ну так трусы или крестик.

                        Ты или юзаешь транзакции или нет

                        Но вообще это задача для queue а не субд
                        Ответить
                        • > 1) взял, 2) увеличил, 3) записал

                          По моему только в говносраном mysql пыхоинвалиды привыкли делать select max(id)+1 перед тем, как сделать insert, ну или делать говнотаблицу shit.sequences (tablename, nextvalue). Это всё от скудоумия.

                          В оракле, например, cache у последовательности по умолчанию 20. Это значит, что сервер в принципе держит наготове следующие 20 значений в оперативной области (а сиквенс уже их как бы выдал). Кеш протухает, неиспользованные значения никогда не заинсертятся. Вот и бывают таблицы, где айди вообще выглядят как 21, 41, 61 ... И ничей брат не помер от этого.

                          Как и не должен помереть от того, что строка с id = 5 появится на долю времени перед строкой с id = 4, а строки с id = 3 вообще не будет, т.к. та транзакция откатилась.

                          Че с этим делать, не забиваясь в один поток, я предложил ниже.

                          > Но вообще это задача для queue а не субд
                          именно

                          Вообще подобные лочки на беке, если они с малой кровью возможны на беке (к примеру, мутекс в HA-кластере это тоже не хуй собачий) надо делать на беке, т.к. даже самый быстрый субд движок - это ~ 1/1000 скорости бека в подобных операциях
                          Ответить
                          • > мутекс в HA-кластере
                            Слон в посудной лавке.
                            Ответить
                            • Без лок-сервиса с нотификациями нормальный кластер не сделаешь. Как мастера выбирать? Как следить за изменениями в сети?
                              Ответить
                              • у кого виртуальный айпишник - тот и мастер
                                Ответить
                              • > Как мастера выбирать
                                Голосованием, как в raft'е.
                                Ответить
                                • > Голосованием, как в raft'е.

                                  Ну так в итоге голосования ты что получишь? Один процесс будет мастером, т.е. держать ЛОК, пока у него большинство голосов.
                                  Ответить
              • Да, именно этот кейс.
                Ответить
                • Какая СУБД? Есть ли планы уменьшать транзакции?
                  Ответить
                • ну что молчишь?)
                  Как я понял задачу, у тебя есть "читатели", которые должны как бы из очереди забрать сведения из таблицы для обработки.

                  Если эту задачу уж прямо так хочется решать при помощи средств СУБД, то я бы посоветовал следующий способ (с вариациями):
                  1) параллельно с инсертом в основную таблицу (например, foo) инсертить в соседнюю foo$unprocessed (id int8 primary key references foo.id on delete cascade on update cascade). Дополнительно foo$unprocessed может содержать доп колонки, а-ля сведения о читателе, который "забрал" себе запись на обслуживание, или таймстамп записи foo, если он более надежный, чем айди из сиквенса, но её задача быть максимально шустрой.

                  Читатели работают прежде всего с таблицей foo$unprocessed, делая в ней select ... for update, сортировку, критерии селекта выберешь сам - например, не более 100 записей. Получив массив айдишников, которые теперь принадлежат конкретному читателю, он может обработать полноценные записи, прочитав их из foo. По окончанию обработки читатель удаляет из foo$unprocessed к хуям залоченные в селекте строки, коммитит.

                  Т.о. таблица foo$unprocessed будет очень небольшая по размеру, предоставлять очень быстрый DML и, главное, select for update будет делать row lock, а не лок на всю таблицу/систему, при этом не позволять проебываться записям.

                  В постгресе, например, есть вообще охуенная конструкция select for update skip locked, которая тебе даст практически то, что нужно для нескольких читателей.

                  2) если не хочется создавать таблицу рядом, можно сделать то же колонками прямо в foo. Этот вариант мне нравится меньше, у него только минусы по сравнению с первым вариантом. Могу рассказать подробнее.

                  3) к хуям эти dbms-based трюки, делаешь шину между пейсателями и читателями, которая, конечно, и в базу что-то персистит, но это не влияет на её основную задачу.
                  Ответить
                  • > ну что молчишь
                    На работе не до ГК, сорри :(

                    Не, мне не очередь нужна. Всё прозаичнее - тупо лента с комментами. Поэтому сохранять unprocessed на каждого читателя (я не знаю, сколько их вообще) будет немного невыгодно.

                    Так что, наверное, проще сериализовать писателей об лочку или вообще заменить sequence на таблицу с полем-счётчиком и select for update + update (та же лочка, просто неявная). И монотонность будет, и читателям не повредит...
                    Ответить
                    • для тупо ленты с комментами надо ватерлинию для пары юзер-пост сохранять в виде last_read_time, а в каждом каменте хранить created_time (он там и так будет причем!), а не опираться на монотонность айдишников

                      и каменты не банковские транзакции - не так и критично не проебать камент, созданный за миллисекунду до твоего запроса контента, не надо героически решать проблему, которую можно решить негероически (показывать не только все непрочитанные каменты, но и каменты за последние N секунд/минут, относительно last_read_time)
                      Ответить
                      • Да, походу я действительно перегнул палку...

                        Но, если пирфоманс вставок не так уж критичен, то проще монотонность айдишников поддержать, чем поставить всё на атомные часы ntpd и монотонность времени.
                        Ответить
                    • Ты работу сменил?
                      Ответить
                  • показать все, что скрытоНу ты архитектор.
                    Ответить
                  • > шину между пейсателями и читателями
                    А вот это, походу, само то, если у меня до вебсокетов руки дойдут...
                    Ответить
                    • Вот так вот, никому не нужно было, и вдруг все бросились делать даже я подумывать стал
                      Жаль только, что у семи нянек дитя без глазу
                      Ответить
                      • Ну у меня планы не особо амбициозные - просто r/o зеркало.

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

    Добавить комментарий