
blkmrkt
26.05.2017
19:29:28
Хочу хранить юзерские сессии в постгресе, вместо того чтоб разворачивать Редис: можно ли как-то заставить движок держать всю таблицу в памяти и отключить на ней fsync/wal?

Sergey
26.05.2017
19:30:41
какая версия постгри?
хотя, даже в 9.2 есть возможность создавать UNLOGGED-таблицы, транзакции в которых не проходят через WAL. И соответственно они не реплицируются

Alex
26.05.2017
19:31:55
А зачем редис? Мемкэша не хватает? Максимально просто, никакого оверхеда

Google

عاصم بن حارث
26.05.2017
19:32:22
PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17), 64-bit

Anatoliy
26.05.2017
19:33:20

Dmitry
26.05.2017
20:24:08

Darafei
26.05.2017
20:34:19

blkmrkt
26.05.2017
20:38:14

Darafei
26.05.2017
20:38:43
уберёт 90% хождений в диск

blkmrkt
26.05.2017
20:39:37
вообще всегда как что берусь делать, теряюсь в плане того где хранить сессии, стараюсь использовать jwt где это возможно

Fike
26.05.2017
20:40:11
сессии в jwt?
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/

blkmrkt
26.05.2017
20:40:59
сессии в jwt?
ну если не нужна возможность сессии убивать, и нечего скрывать, то все мясо кладется в jwt

Fike
26.05.2017
20:41:59
а я все равно кажется не ту ссылку закинул лол

Google

blkmrkt
26.05.2017
20:42:13

Alex
26.05.2017
20:56:43
Да, я знаю, что можно. Но говно же медленное выходит
Тем более, если персистентность не требуется
512 метров объекта, это хорошо, но в других местах

blkmrkt
26.05.2017
21:00:48
Хреново что TTL для тупла из коробки не задать

Alex
26.05.2017
21:02:21
Вот постгрес в раме, без стабилизаторов в виде фсинка... Сама устойчивость?

blkmrkt
26.05.2017
21:02:36
не не, не весь постгрес, а одна таблица же

Alex
26.05.2017
21:06:29
Жесть. Кстати, мемкэш туп и прост, тем самым рисков падения немного. Ну и key-value. Либы есть в большинстве языков. Хз, зачем тебе такой геморрой. Не успел вакуум, сожралась рама, своп. И снова копайся с базой

blkmrkt
26.05.2017
21:07:06

Alex
26.05.2017
21:07:43
Приложение то на чем?

blkmrkt
26.05.2017
21:07:49
хотел на go начать, но долго осиливать их ORM, и производительность почти идентична

Alex
26.05.2017
21:08:56
Глянь ещё про ledis. Это вроде форк редиса, но там многопоточность, все дела
Ну да

blkmrkt
26.05.2017
21:09:30

Anatoliy
26.05.2017
21:12:56
А можно всю схему пометить unlogged? \cc @Komzpa

Darafei
26.05.2017
21:14:56
не встречал

Google

Anatoliy
26.05.2017
21:18:06
Можно конечно выдрать все таблицы из information_schema и на pl/pgsql обойти. Но вообще, было бы удобно. Допустим есть схема биллинга – обсчет всегда происходит на мастере, а эти таблицы на слейвах нафиг не нужны.

Darafei
26.05.2017
21:21:52
эмм, unlogged таблицы после креша транкейтятся
это то, чего ты хочешь в биллинге? :)
ну, эм, то есть select st_asx3d('LINESTRING EMPTY'); от любого юзера по идее сотрёт тебе все unlogged таблицы

blkmrkt
26.05.2017
21:36:17
Нубский вопрос про то как правильно сделать типичный биллинг, пока есть время исправить если что делаю не так:
- Пользователи покупают подписки, выбирая из N планов
- Подписки ребиллятся раз в месяц или раз в год
- Активация подписки выставляет счетчики доступных юзеру действий до следующего продления
Моя схема:
Plans
- id
- name
- actions_count
- price
- ...
Users
- id
- plan_id :: Plan
- actions_left
- paid_till
- ...
Orders
- id
- user_id :: User
- plan_id :: Plan
- status
- ...
Проблем не должно возникнуть?


Anatoliy
26.05.2017
21:37:11
У нас есть проект один, в котором есть толькотаблица с балансами юзеров и инвойсами и не так давно мы обнаружили баг с адвизори локами, в которых ключем присутствовали два разных ID по невнимательности разработчика. Платежная система слала два запроса – один на фронтенд (редирект), другой на бекенд (подтверждение платежей) и в случае если они пападали в одну секунду – баланс пополнялся дважы, но бабки было уже не свести (но мы свели, потому что у нас есть еще косвенное логирование операций).


blkmrkt
26.05.2017
21:44:39
У нас есть проект один, в котором есть толькотаблица с балансами юзеров и инвойсами и не так давно мы обнаружили баг с адвизори локами, в которых ключем присутствовали два разных ID по невнимательности разработчика. Платежная система слала два запроса – один на фронтенд (редирект), другой на бекенд (подтверждение платежей) и в случае если они пападали в одну секунду – баланс пополнялся дважы, но бабки было уже не свести (но мы свели, потому что у нас есть еще косвенное логирование операций).
Аа, это если вы баланс храните у себя, тогда логично. А у меня между периодами биллинга ничего не сохраняется от старой подписки, просто обновляются счетчики. Только непонятно что делать если нужно апгрейдить/даунгрейдить план подписки, в таком случае полезно иметь таблицу с аудитом, и по ней считать сколько нужно доплатить


Anatoliy
26.05.2017
21:49:30
В случае даунгрейда, надо будет списывать меньше

Anatoliy
26.05.2017
21:49:55
В случае апгрейда – больше
Было бы тупо считать, сколько нужно рефандить юзеру, высчитывая дни с момента пополнения, чтобы даунгрейдить или апгрейдить.

blkmrkt
26.05.2017
21:51:12
Точно

Anatoliy
26.05.2017
21:53:32
Алгоритм описан по "Главная бухгалтерская книга" в инете

blkmrkt
26.05.2017
21:53:48

Anatoliy
26.05.2017
21:54:11
Сформированный заказ на оплату может быть не оплачен.
Когда юзер перешел на страницу оплаты в платежную систему – он может тупо закрыть окно
каждая платежная система передает внутренний ID операции (и подтверждает по нему)

Google

Anatoliy
26.05.2017
21:54:58
Поэтому инвойсы нужны, иначе вы не будете знать о их статусе исполнения

blkmrkt
26.05.2017
21:56:32

Anatoliy
26.05.2017
21:57:12
ну это те же яйца, только в профиль)

blkmrkt
26.05.2017
21:58:07
Заказ ведь генерируется по желанию пользователя оплатить, а инвойс я думаю лучше делать на лету. Потому что многие например оплачивают фирменной картой, потом долбятся в суппорт с просьбой изменить хедер в инвойсе, "пожалуйста, а то бухгалтерия наша не принимает"

Admin
ERROR: S client not available

Anatoliy
26.05.2017
21:59:15
Ну это все от специфики бизнеса – понимание "как надо" приходит с хотелками комерса и факапами с балансами.

blkmrkt
26.05.2017
22:01:35
А вы с несколькими платежными системами работали? Я хочу начать со stripe и fondy - есть смысл тащить в базу данные о гейтах (тут имею ввиду ключи доступа), или оставить это в env vars апи сервера?
Думаю что нужно, и еще иметь флаг активен гейт или нет, чтоб оперативно без рестартов обновлять это дело

Anatoliy
26.05.2017
22:05:26
Гейты ака креды ака пароли, лучше зашить куда-нибудь в environments на продакшн серверах (имхо) или файл доступ к которому имеет только приложение если речь об этом. Алсо, весь обмен с платежными системами есть смысл хранить, делать либо а ля enum для каждой платежной системы – либо вообще по таблице на каждую.

blkmrkt
26.05.2017
22:08:58
Наверное все-таки в одну таблицу их сложу - все равно для каждого нужен отдельный хттп хендлер, вот он пускай и проверяет активен ли гейт и берет оттуда свежие мерчант ид и ключи

Dmitry
27.05.2017
10:20:30
Коллеги, а можно как-нибудь изменить тип колонки таблицы над которой накручена пачка materialized view зависящих от этой колонки не грохая их? Т.е. чтобы они сами пересоздались

Max
27.05.2017
11:12:30
Всем привет. Подскажите, кто знает. Нужно ограничение уникальности на n количество полей. Например есть три поля и значения в них не могут повторяться. Получается мне нужно ограничение не только в пределах столбца но и столбцов строки
строка1: 1|2|3
строка2: 4|5|6
и теперь эти числа не могут больше использоваться. Из коробки ничего нет, триггер писать?
хм, как в пределах строки я придумал
create table test (
col1 INT CHECK (col1 NOT IN (col2, col3)),
col2 INT CHECK (col2 NOT IN (col1, col3)),
col3 INT CHECK (col3 NOT IN (col1, col2))
);
а как теперь в пределах столбцов других строк
заводить отдельную таблицу для значений, вставлять сначала в нее, например по триггеру, а в ней тупо одно поле PK, .... это как-то не круто вроде

Vit
27.05.2017
11:57:23


Max
27.05.2017
12:05:35
по-моему это сложнее чем то что я выше написал про одну таблицу значений. Мне не надо знать в кокой строке каком столбце. Просто важно чтобы в пределах всех строк, определенного набора полей значение не повторялось
это коды доступа, при вводе котрых выполняется соответствующая операция, операции сейчас три, на каждую свой код ... хотя возможно вы и правы, сейчас писать вот начал и подумал, что если операций будет больше, то заводить столбцы под каждую в сущьности не вариант и проще сделать связанную таблицу

Igor
27.05.2017
12:12:16
повесть уникальный индекс ?

Google

Max
27.05.2017
12:13:43
он не решает задачу только в пределах столбца

Igor
27.05.2017
12:14:08
а, я думал ты решил про уникальность в строке
уникальный индекс помог бы со столбцом

Max
27.05.2017
12:14:44
да но не другим столбцом в другой строке ))
сделаю наверное отдельную таблицу - ссылка на сущность, код, какая операция. И на код уникальный индекс

Vit
27.05.2017
12:16:35
С eav начнутся проблемы при большом количестве столбцов. Множественные join и вот это всё плохо скажется на производительности . А если колонок всего три, то почему бы и нет.

Max
27.05.2017
12:17:06
вот такого не должно быть
спасибо за советы

Kirill
27.05.2017
12:20:44
Sequence использовать в качестве значений - не подходит?

Max
27.05.2017
12:21:50

Dmitriy
27.05.2017
19:33:10
Коллеги, приветствую!
Внимание, вопрос: есть ли у postgres аналог Events shelduler мускульного?

Kirill
27.05.2017
19:35:42
Из коробки нет, но есть лучше чем Events shelduler https://github.com/citusdata/pg_cron

Alexey
28.05.2017
07:06:31