use msg envelope, keep msg value immutable