влияние транзакций на большие группы объектов (python, NDB, Master/Slave) на производительность.

У меня есть несколько десятков тысяч связанных небольших сущностей (NDB поверх Master-Slave, однажды придется перейти на HRD ..), которые я хотел бы поместить в одну группу сущностей, чтобы разрешить транзакции.

Небольшие подмножества этих сущностей будут обновляться транзакциями.

Каковы последствия этой установки для производительности?

Означает ли это, что вся группа блокируется во время обновления? т.е. одна транзакция за раз.

Спасибо!




Ответы (1)


Существует приблизительный предел производительности: 1 транзакция записи в секунду для группы сущностей. Вся группа блокируется для обновления. Последующая транзакция завершится ошибкой и повторится.

10 000 сущностей в группе сущностей — это много, но на самом деле это зависит от ваших шаблонов записи. Например, если когда-либо обновляются только несколько объектов в группе, это может не быть большой проблемой. Однако, если случайные пользователи постоянно обновляют случайные сущности в группе, вам нужно разделить ее на несколько групп сущностей.

person dragonx    schedule 20.12.2012
comment
ограничение производительности в 1 транзакцию записи в секунду - означает ли это, что для завершения 5 одновременно запущенных транзакций (на объектах одной группы) потребуется ~ 5 секунд? - person Srg; 20.12.2012
comment
Это может произойти, поскольку в инфраструктуре транзакций есть автоматический повтор. Также возможно, что первые несколько транзакций будут успешными, а более поздние могут просто потерпеть неудачу (это более вероятно при большем трафике). - person dragonx; 20.12.2012
comment
В каждой группе есть два типа сущностей. Сущности первого типа (несколько тысяч) меняются редко (несколько раз в неделю), сущности второго типа (тоже несколько тысяч) будут меняться несколько раз в день. - person Srg; 20.12.2012
comment
Имеет ли значение фактическое отсутствие конфликта между обновлениями? Я ожидаю, что случаи, когда две транзакции пытаются обновить один и тот же объект, будут очень редкими. - person Srg; 20.12.2012
comment
Когда вы помещаете их в одну и ту же группу сущностей, вы ограничиваете всю группу сущностей. По сути, если вы помещаете сущности в одну и ту же группу сущностей, они рассматриваются как единое целое с точки зрения транзакций. Если вы хотите повысить производительность, вы хотите, чтобы ваши объекты находились в отдельных группах. Из-за этого вы обычно хотите свести количество сущностей в группе к минимуму, если это возможно. - person dragonx; 20.12.2012
comment
Итак, когда я использую get_or_insert для корневых записей (без родителей), является ли это бесплатным обедом с точки зрения производительности? Или мне заблокировать весь Вид на секунду? - person Srg; 21.12.2012
comment
Теоретически вы можете иметь сколько угодно параллельных процессов, пока аппаратное обеспечение Google не перестанет работать. - person dragonx; 21.12.2012
comment
Вау, спасибо! Это помогает :) Я думаю, что я помещу один объект в группу (для защиты) и попытаюсь использовать тасклеты, чтобы восстановить некоторую производительность. - person Srg; 21.12.2012