Разработка аукционной площадки
Аукционная платформа — один из технически нагруженных типов торговых площадок: ставки должны обрабатываться в режиме реального времени, система защищена от race conditions, таймер синхронизирован между всеми участниками. Типы: английский аукцион (ставки растут), голландский (цена падает), закрытые торги, аукционы с резервной ценой.
Типы аукционов
Английский (восходящий): участники повышают ставку. Побеждает последний поставивший наибольшую ставку до истечения времени. Anti-sniping: если ставка сделана в последние N секунд — таймер автоматически продлевается.
Голландский (нисходящий): цена начинается высоко и падает автоматически. Первый нажавший «Купить» получает лот по текущей цене. Применяется для скоропортящихся товаров, цветов.
Закрытые торги (sealed-bid): все участники подают ставку один раз, не видя чужих. Побеждает наибольшая ставка. Применяется на тендерных площадках.
Автоматическая ставка (proxy bidding): участник указывает максимальную цену, система автоматически поднимает ставку до победы или исчерпания лимита.
Race Conditions и конкурентные ставки
Главная техническая проблема: два участника одновременно отправляют ставку — кто побеждает?
Решение через оптимистичную блокировку в PostgreSQL:
-- Атомарное обновление ставки с проверкой версии
UPDATE auctions
SET current_bid = $new_bid,
current_bidder_id = $user_id,
version = version + 1,
updated_at = NOW()
WHERE id = $auction_id
AND version = $expected_version -- проверяем, что никто не успел раньше
AND current_bid < $new_bid; -- ставка выше текущей
-- Если UPDATE затронул 0 строк — ставка устарела, возвращаем ошибку
Альтернатива для высокой нагрузки — Redis SETNX + Lua script для атомарного обновления текущей ставки.
Realtime-обновления
Все участники аукциона должны видеть обновления ставок в реальном времени:
- WebSocket-подключение при входе на страницу аукциона
- При новой ставке — broadcast в комнату аукциона:
{auction_id, new_bid, bidder_name_masked, remaining_time} - Таймер синхронизируется с сервером каждые 10 секунд (не полагается на client-side clock)
// Socket.io на сервере
io.to(`auction:${auctionId}`).emit('bid_placed', {
bidAmount: bid.amount,
bidderAlias: `Участник ${bid.alias}`,
remainingSeconds: auction.endsAt - Date.now(),
});
Депозиты и блокировка средств
Для серьёзных торгов участник вносит депозит перед участием — гарантия намерений. При победе депозит засчитывается в оплату; при проигрыше — возвращается.
Реализация: Stripe PaymentIntent с capture = manual. Деньги авторизованы (заблокированы), но не списаны. После победы — capture. После проигрыша — cancel авторизации.
Система уведомлений
- Вас перебили → немедленно (push/email)
- 1 час до окончания → напоминание
- Победили → поздравление + инструкция по оплате
- Аукцион завершён без вашей победы → результаты
Escrow и оплата
После победы: обычная схема — покупатель платит → продавец отправляет → покупатель подтверждает → деньги продавцу. Дополнительно: insurance против мошенничества (описание не соответствует).
Модерация лотов
Перед стартом аукциона лот проходит модерацию: соответствие правилам платформы, проверка документов права собственности (для дорогих товаров), подтверждение наличия товара.
Сроки
MVP (английский аукцион, ставки с race condition protection, realtime WebSocket, базовые уведомления): 3–4 месяца. Полноценная платформа с proxy bidding, несколькими типами аукционов, депозитами и escrow: 5–8 месяцев.







