Sergey
извини, перечитал переписку но не догнал чем плохо, можешь объяснить, пожалуйста? Хочу понять.
Чтобы достать сообщения одного пользователя в случае с id надо делать или два запроса или lookup. При этом, более сложные запросы уже будут достаточно неэффективными.
Anonymous
Чтобы достать сообщения одного пользователя в случае с id надо делать или два запроса или lookup. При этом, более сложные запросы уже будут достаточно неэффективными.
понимаю, а почему в случае с username нет? ведь придется выбирать так же 2 запросом или через лукап, но связывать через другое поле?!
Anonymous
Потому что username уже лежит в каждом сообщении
так ведь и _id тоже, в мое случае будет Post.find({ _author: req.user.id }, а в случае с uname Post.find({ _author: req.user.name } ?!
Sergey
И посчитать количество сообщений - простейший count по логину
Cap
задача довольно простая - вывожу список пользователей и у каждого указываю количество записей, пользователь и запись связаны через _id
эффективная структура данных зависит не от того что есть а от того как это обновляется и как достаётся Например у меня есть большой объект пользователь в нём есть блок Stat в котором gameCount - счётчик игр когда пользователь сыграл игру, этот счётчик инкрементится когда нужно отобразить статы, я просто считываю этот блок Stat со всеми статами и показываю в профиле всё просто и никаких долгих агрегатных запросов ничего не рзъезжается
Sergey
у меня все операции атомарные, нет никаких двух запросов
Ну так речь была про инкремент счётчика, он явно лежит не в сообщении. А значит добавление сообщения и инкремент счётчика - два разных запроса
Cap
тоесть все таки правильней заносить данные в документ при выполнении действий, а не считать связанные документы при каждой выборке?
если нужно моментально доставать профиль - то должно быть всё заранее расчитано если не нужно моментально - то можно считать во время запроса
Sergey
Тогда да, верно - два запроса, а что может случиться ?
Сообщение может добавиться, а инкремент - не пройти
Sergey
Почему ?
Пр любой причине: лаг сети, база упала или что-то ещё
Igor
если база упала, наверное, есть причины для беспокойства поважнее, чем рассинхрон счетчиков, не?)
Sergey
А если щарды, то запись вообще может быть в разные primary
Cap
если база упала, наверное, есть причины для беспокойства поважнее, чем рассинхрон счетчиков, не?)
Вот именно ) Если это инфа архи важная например банковский счёт с деньгами, то следает предусмотреть механизм транзакций на сервере, для таких операций.
Cap
Пр любой причине: лаг сети, база упала или что-то ещё
а что лаг, как он не даст заинкрементить счётчик ?
Anonymous
Пользуюсь счётчиками, брат жив, зависимости нет.
Anonymous
Делаю переиндексацию раз в месяц, когда мне больше делать нечего.
Anonymous
Рассинхрон бывает редко.
Sergey
а что лаг, как он не даст заинкрементить счётчик ?
Ну зависит от того как бек настроен, наверное не лучший вариант при вставке висеть 10+ секунд без ответа пользователю, пытаясь повторить вставку в общем-то не критичного счётчика
Anonymous
С очередью ещё одна проблема появляется)
Это так. В моём случае счётчики не содержат важную величину (деньги или ещё что-то такое), поэтому я могу позволить себе небольшую погрешность. Правда, как я уже говорил, рассинхрон бывает очень редко.
Cap
Ну зависит от того как бек настроен, наверное не лучший вариант при вставке висеть 10+ секунд без ответа пользователю, пытаясь повторить вставку в общем-то не критичного счётчика
Причём тут висеть, мы же о целостности разговаривали и транзакциях У меня реактивная архитектура (Akka actors) там ничего не блокируется, вставка выполнится через 10 сек обоих записей. При этом запросы продолжат обрабатываться. Учитывай вероятности возникновения событий. Те вещи про которые ты пишешь случаются раз в год или реже (у меня к примеру ниразу так до сих пор база не падала в продакшене за два года)
Sergey
Ну база может и не упадёт, но дц, где находится мастер, вполне может отвалится
Cap
ну понятно, просто это счётчики, если у одного из пользователей он нарушится на 1, за два года работы и то если сильно не повезёт. То в этом нет ничего страшного. Если они важны реализуй транзакции. Но имхо это лишнее
Cap
Соотноси ценность инфы и затраты
Cap
В случае с отложенной вставкой ещё надо реализовывать 2PC иначе больше проблем, чем пользы. Пользователь на свое действие получил ок, а данные до базы не доехали.
в штатном режиме который в 99.999999% данные доезжают моментально, и берутся они не из базы а из сессий в большинстве случаев а там они обновляются сверх моментально )
Sergey
Сессии на стороне браузера? А как синхронизация происходит?
Cap
У меня сессионная игра. Сессия на сервере
Sergey
И один бекенд?
Cap
Когда игрок заходит - загружается его сессия (профиль и вся инфа). Далее все обновления вносятся вначале в сессию а затем сессия дёргает бд и записывает в базу.
Cap
Пока один сервер, который при нагрузочном тестировании держал 60к CCU. Пока это гораздо больше чем игроков ) А потом возможно будем масштабировать
Cap
Пошаговая сессионка, мобильная игра, типа HeartStone
Sergey
Ну если сервер один, то да - проблем в синхронизации нет
Cap
А если 2
Cap
Просто половина игроков будут направлены на другой бэкенд и всё тоже самое
Sergey
Если два, то эти сессии уже надо как-то синхронизировать
Cap
ненада
Igor
игрок же не может одновременно дважды из-под одного акка зайти?
Sergey
А с чем их синхронизировать ?
Между двумя серверами.
Cap
ну это не синхронизация а роутинг т.е. есть load balancer который один на кластер, и который распределяет по серверам игроков, и знает кто где сидит (по Id) и переправляет запросы Это имеется ввиду ? При традиционном подходе как то так делается. Но с Akka проще. Во первых акторы поддерживают location transparency. (т.е. акторы можно разнести по машинам и они также будут работать как и на одной, при этом код их не поменяется. А также в Akka Cluster есть готовые примитивы, для построения распределённых систем. Типа Cluster Singleton, различные балансеры, которые раскидывают работу в зависимости от нагрузки на ноду, или по каким либо другим правилам ...
Sergey
Ну если akka такая крутая и все делает за разработчика, то ок. Я хз что это, первый раз слышу.
redbeard
это ббилиотека для работы с акторами
redbeard
есть и для скалы, и для C#
Cap
Да, её использует Ebay , Blizzard, CISCO, BBC и другие никому неизвестные компании
redbeard
what'sapp все равно написан на erlang :)
redbeard
а вот вопрос: подписка на что в кластере требуется? что отлавливаем?
Cap
да это Erlang тоже акторы, похож на Akka
Cap
Вот уж не думал, что ebay на дотнете работает
Ты не то нагуглил Восновном Akka + Scala , Akka + Java на JVM - популярны
Cap
а вот вопрос: подписка на что в кластере требуется? что отлавливаем?
Отлавливать вход выход нод из кластера, загрузку нод и прочее
Cap
наоборот :)
Есть и такое мнение )
redbeard
Отлавливать вход выход нод из кластера, загрузку нод и прочее
хм... это в нормальной платформе давно есть :)
redbeard
Есть и такое мнение )
это не мнение, ибо ирлонг с 1987 года существует :)
redbeard
2 Сергея пишут, пойду желание загадывать
Cap
хм... это в нормальной платформе давно есть :)
Получается Акка нормальная платформа ? )
Sergey
Отлавливать вход выход нод из кластера, загрузку нод и прочее
Я больше сторонник классического подхода: haproxy + quagga)
redbeard
Скала - то еще чудо
Cap
Я в проекте использую Java + Akka + MongoDB
yopp
Ребят, вернитесь к монге.
Cap
да давайте
Roman
Всем привет, есть ли тут кто-нибудь из страдальцев php/mongodb?
Cap
Так все печально с php?
Sergey
Краем уха слышал, что в пхп есть какой-то новый драйвер в котором все ок.
Anonymous
Всем привет, есть ли тут кто-нибудь из страдальцев php/mongodb?
Может быть смогу тебе подсказать. Но после того, как драйвер для PHP переписали, я нахуй послал связку PHP + MongoDB.