Баг не воспроизводится локально. На проде один юзер видит чужие данные 👇
📦 Задание
Стартап запустил SaaS. Первые две недели тишина. А потом в поддержку прилетело: «Я зашёл в кабинет и увидел чужой аккаунт». В коде сессий и авторизации не трогали давно, там всё стабильно.
// src/Auth/UserSession.php
class UserSession
{
private static ?User $currentUser = null;
public static function set(User $user): void
{
self::$currentUser = $user;
}
public static function get(): ?User
{
return self::$currentUser;
}
public static function clear(): void
{
self::$currentUser = null;
}
}
// src/Middleware/AuthMiddleware.php
class AuthMiddleware
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly JWTService $jwt,
) {}
public function handle(Request $request, callable $next): Response
{
$token = $request->headers->get('Authorization');
if (!$token) {
return new Response(status: 401);
}
$payload = $this->jwt->decode(str_replace('Bearer ', '', $token));
$user = $this->userRepository->find($payload['sub']);
UserSession::set($user);
return $next($request);
}
}
// src/Controller/DashboardController.php
class DashboardController
{
public function index(): Response
{
$user = UserSession::get();
return new Response(
body: $this->renderDashboard($user),
);
}
}
// src/Console/CacheWarmupCommand.php
class CacheWarmupCommand
{
public function execute(): void
{
$users = $this->userRepository->findAll();
foreach ($users as $user) {
UserSession::set($user);
$this->warmupForUser($user);
}
// прогрев завершён
}
}
🔹 Задачи
— Объяснить механизм утечки
— Объяснить, как CacheWarmupCommand триггерит баг и при каком race window
— Переписать UserSession так, чтобы устранить проблему архитектурно, а не патчем
Ставьте → 🔥 если нравится формат. Если нет → 🌚
💬 Решения пишите в комменты под спойлер — сравним подходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤔5🌚2👍1🥱1
Strategy — это
Когда использовать:
—
—
—
Преимущества:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5
Singleton — это
🔹 Основные характеристики:
—
—
—
🔹 Когда использовать:
—
—
—
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥3❤1👍1
Adapter (Адаптер) — это
🔹 Когда использовать:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2❤1
Factory Method —
🔹 Когда использовать:
🔹 Как работает:
🔹 Плюсы:
—
—
—
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2❤1👍1👏1
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
🌚3
Пользователь нажал «Оплатить» один раз. Деньги списались дважды.
📦 Задание
Фича: интеграция с платёжным шлюзом. Платёж создаётся на бэке, пользователь редиректится на страницу шлюза, после оплаты шлюз дёргает webhook. По webhook'у выдаётся доступ к продукту.
Жалобы начались через две недели после релиза. Только у части пользователей, только в часы пик. У некоторых списывалось дважды, у других доступ не выдавался вовсе.
// src/Payment/WebhookHandler.php
class WebhookHandler
{
public function __construct(
private PaymentRepository $payments,
private OrderRepository $orders,
private AccessService $access,
private Mailer $mailer,
) {}
public function handle(array $payload): void
{
$externalId = $payload['payment_id'];
$status = $payload['status'];
if ($status !== 'success') {
return;
}
$payment = $this->payments->findByExternalId($externalId);
if ($payment === null) {
return;
}
$order = $this->orders->findById($payment->orderId);
if ($order->status === 'paid') {
return;
}
$this->orders->markAsPaid($payment->orderId);
$this->access->grantForOrder($order);
$this->mailer->sendReceipt($order);
}
}
// src/Repository/OrderRepository.php
class OrderRepository
{
public function __construct(private PDO $pdo) {}
public function findById(int $id): Order
{
$stmt = $this->pdo->prepare(
'SELECT * FROM orders WHERE id = ?'
);
$stmt->execute([$id]);
return Order::fromRow($stmt->fetch(PDO::FETCH_ASSOC));
}
public function markAsPaid(int $orderId): void
{
$stmt = $this->pdo->prepare(
'UPDATE orders SET status = ? WHERE id = ?'
);
$stmt->execute(['paid', $orderId]);
}
}
🔹 Задачи
— Объяснить, как именно возникает двойное списание при одном нажатии пользователя
— Исправить WebhookHandler::handle
Ставьте → 🔥 если нравится формат. Если нет → 🌚
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤2👍1