Я пытаюсь реализовать данные контекста сеанса для очереди сообщений.Async (Очередь) Сообщения и связанные с ними данные сеанса
Обработка сеанса выглядит следующим образом: Приложение для внешнего интерфейса аутентифицируется и получает идентификатор сеанса. После этого идентификатор сеанса включен в заголовки сообщений, поэтому обработчик сообщения снабжен контекстом, например. проверки безопасности и ведение журнала аудита. Клиент может забрать сеанс, если он разбился и продолжит работу.
Итак, теперь мы хотим связать пары ключ/значение с идентификатором сеанса. Но это создает много проблем параллелизма, если данные сеанса изменяются, поскольку данные сеанса, используемые обработчиком сообщений, должны быть такими, как в момент отправки сообщения.
Я вижу два возможных решения:
- Помещенный связанные данные сессии в каждом заголовке сообщения
- Хранить данные сессий версирована в базу данных и использовать идентификатор версии в заголовке сообщения.
Первый делает сообщения больше, второй делает сессионную БД более крупной и создает много инфраструктурного кода. Мне нужно сохранить самые последние значения в БД в обоих случаях, поэтому клиент может продолжить работу, если он разбился или потерял соединение.
Есть ли другие решения? Я предпочитаю использовать первое решение, но сначала хочу получить обратную связь.
Как другие справляются с этим (например, JMS/NServiceBus/Masstransit)?
Обновление от ответа: Я выбрал путь, чтобы убедить членов моей команды использовать данные сеанса только в интерфейсе и помещать его в сообщения, если это необходимо для обработчика сообщений.
Вы правы с помощью схемы сообщений. Данные сеанса должны оставаться в интерфейсе и сохраняться только для восстановления. Неправильное размещение соответствующих бизнес-данных в заголовках или в базах данных внешней сессии. – sanosdole