Skip to content

Type Resolution

Type resolution registry

Type resolution - это механизм, с помощью которого ChokaQ мапит persisted string key из SQL на .NET job type во время runtime.

Persisted key - durable contract. CLR type - implementation detail, который можно rename, move или version.

Где это находится

JobTypeRegistry поддерживает два mapping:

DirectionUse
key to typeWorker dispatch при чтении persisted jobs.
type to keyEnqueue path при serialization нового job.

Profiles заполняют registry при startup.

Используйте semantic versioned keys:

csharp
CreateJob<SendEmailJob, EmailHandler>("email.send.v1");
CreateJob<CapturePaymentJob, CapturePaymentHandler>("billing.capture-payment.v1");

Не persist'ите короткие CLR names вроде SendEmailJob. Они удобны, пока не изменится namespace, assembly или class name.

Strict mode

ChokaQ:TypeResolution:RequireRegisteredJobTypes управляет тем, разрешены ли unregistered job types.

Strict registration безопаснее для production:

  • startup profiles определяют contract surface;
  • unknown SQL rows fail clearly;
  • refactors не меняют persistence keys silently.

Compatibility fallback может использовать assembly-qualified names, но это связывает stored jobs с CLR identity.

Failure modes

FailureCauseFix
Unknown type keyProfile missing или wrong key.Register key или migrate row.
Duplicate keyДва profiles claim'ят один key.Сделать keys globally unique.
Old row after refactorCLR fallback key changed.Использовать semantic keys и migration strategy.
Payload mismatchType resolved, но payload contract changed.Version type keys и payload DTOs.

Архитектурное решение

Почему этот pattern?

Durable jobs живут дольше code deployments. Stable string contract безопаснее, чем persisting raw CLR identity как primary dispatch mechanism.

Trade-offs

Semantic keys требуют discipline. Developers должны version contracts и держать old handlers доступными во время migration windows.

Рассмотренные альтернативы

AlternativeBenefitCost
Persist CLR type nameЛегко на старте.Ломается при refactor и assembly changes.
Store only numeric type IDsCompact.Требует central registry и сложнее debugging.
Dynamic assembly scanningFlexible.Slow, unsafe и unpredictable в trimmed/AOT hosts.

Дополнительные вопросы

Почему не persist CLR type names?
Потому что SQL rows могут пережить refactors. Persisted contracts должны быть stable across code movement.

Как rollout'ить v2 payloads?
Register new type key, держать v1 handler support, пока old rows не drain'ятся, затем retire old key через explicit migration/retention plan.

Что должно происходить с unknown type key?
Он должен fail visibly и быть operator-diagnosable, а не silently dispatch'иться в unsafe fallback.

Лицензия Apache 2.0