danielkorytek/messenger-bridge-bundle 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

danielkorytek/messenger-bridge-bundle

Composer 安装命令:

composer require danielkorytek/messenger-bridge-bundle

包简介

Messenger bridge for Docplanner messaging standard

README 文档

README

Routing key middleware

That middleware gives an ability to routing key modification ie: add current locale key to current message key.

RoutingKeyMiddleware is implementing RoutingKeyResolverInterface.

Configuration:

  • Register middleware
messenger.bridge.routing.app_id_routing_key_resolver:
   class: DanielKorytek\MessengerBridgeBundle\Message\Routing\RoutingKeyResolver\AppIdRoutingKeyResolver

Symfony < 5.1
messenger.bridge.middleware.routing_key:
   class: DanielKorytek\MessengerBridgeBundle\Middleware\RoutingKeyMiddleware
   arguments:
     - '@messenger.bridge.routing.app_id_routing_key_resolver'
   tags:
     - { name: messenger.middleware }

Symfony >= 5.1

messenger.bridge.middleware.routing_key:
   class: DanielKorytek\MessengerBridgeBundle\Middleware\Symf51\RoutingKeyMiddleware
   arguments:
     - '@messenger.bridge.routing.app_id_routing_key_resolver'
   tags:
     - { name: messenger.middleware }
  • Attach a middleware to messenger

In messenger.yml put messenger.bridge.middleware.routing_key to your bus middleware list.

Example:

framework:
       messenger:
           default_bus: command.bus
           buses:
               command.bus: ~
               shared.message.bus:
                   default_middleware: allow_no_handlers
                   middleware:
                       - messenger.bridge.middleware.routing_key

Serialization

For serialize/deserialize messages package is using symfony/serializer. To endure adequate possibility for serialization/deserialization process, you need enable normalizers and denormalizers.

Required serializer configuration:

services:
    serializer.property.normalizer:
        class: Symfony\Component\Serializer\Normalizer\PropertyNormalizer
        arguments:
            - '@serializer.mapping.class_metadata_factory'
            - '@serializer.name_converter.metadata_aware'
            - '@property_info'
            - '@serializer.mapping.class_discriminator_resolver'
            - null
            - []
        tags:
            - { name: serializer.normalizer }

    serializer.date_time.normalizer:
        class: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
        tags:
            - { name: serializer.normalizer }

    serializer.array_denormalizer:
        class: Symfony\Component\Serializer\Normalizer\ArrayDenormalizer
        tags:
            - { name: serializer.denormalizer }

Bus example configuration

framework:
    messenger:
        #your other buses here
        buses:
            shared.message.bus:
                default_middleware: allow_no_handlers
                middleware:
                    #here other middlewares like doctorine transaction etc.
                    - messenger.bridge.middleware.routing_key
        #here is global bus serializer configuration
        serializer:
            default_serializer: messenger.transport.symfony_serializer
            symfony_serializer:
                format: json
                context: { }
        #here is transport configuration
        transports:
            #other transports here
            shared: #configuration of outgoing exchange (messenger is publishing messages here to other apps)
                serializer: messenger.bridge.serializer #our custom serializer for correct serialization/deserialization shared event messages 
                dsn: "%env(MESSENGER_TRANSPORT_DSN)%" #dsn to rabbitmq
                options:
                    exchange:
                    name: "%env(MESSENGER_SHARED_EXCHANGE_NAME)%" #outgoing exchange name 
                    type: topic
            
            incoming:
                 serializer: messenger.bridge.serializer
                 dsn: "%env(MESSENGER_TRANSPORT_DSN)%"
                 options:
                    queues:
                        incoming_events: #your queue name (here yours app receives messages from other apps via exchange)
                            binding_keys:
                                - "%locale%.app-name.smth.changed" #routing key binding list
                    exchange:
                        name: "%env(MESSENGER_SHARED_INCOMING_EXCHANGE_NAME)%" #incoming exchange name
                        type: topic

Messages

All messages representation classes HAVE TO implement NamedMessageInterface. Every message handled by bus, without implementing NamedMessageInterface will throws UnsupportedMessage exception.

Publishing

  1. Check if your bus has allow_no_handlers middleware (it's required). Your bus will publish message to transport only when you don't have any subscriber class for that message.
  2. Add your message FQCN to messenger routing configuration with correct transport name:
       routing:
                'App\SharedEventBus\Test': shared
    

Subscribing

  • Register serializer for external messages
services:

  messenger.bridge.bus_stamp_docplanner.serializer:
    class: DanielKorytek\MessengerBridgeBundle\Message\Serializer\BusStampEnvelopeSerializer
    arguments:
      - '@messenger.bridge.serializer' #docplanner SEB  messages serializer
      - 'shared.message.bus' #bus name from messenger configuration
  • Add message binding key in your incoming transport: This step is for messenger command. If you're using different package, you should update config in proper place.
 incoming:
    serializer: messenger.bridge.bus_stamp_docplanner.serializer 
    dsn: "%env(MESSENGER_TRANSPORT_DSN)%"
    options:
        queues:
            incoming_events: #your queue name (here yours app receives messages from other apps via exchange)
                binding_keys:
                    - "%locale%.app-name.smth.changed"
                    - "%locale%.app-name.smth"  #new key
        exchange:
            name: "%env(MESSENGER_SHARED_INCOMING_EXCHANGE_NAME)%" #incoming exchange name
            type: topic
service:
   messenger.bridge.bus_stamp_docplanner.serializer:
        class: DanielKorytek\MessengerBridgeBundle\Message\Serializer\BusStampEnvelopeSerializer
        arguments:
            - '@messenger.bridge.serializer'
            - 'bus.name.from.messenger.configuration'
  • Create representation class for a message.
  • Attach message mapping to messenger.bridge.subscriber_events_mapping parameter:
messenger.bridge.subscriber_events_mapping:
    app-name.smth.changed: App\Namespace\MessageClass
  • Create subscriber class and bind with correct bus:
<?php

declare(strict_types=1);

namespace App\SharedEventBus;


use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;

class SaasAttendanceSubscriber implements MessageSubscriberInterface
{
    public function __invoke(MessageClass $messageClass): Envelope
    {
        return new Envelope($messageClass);
    }

    public static function getHandledMessages(): iterable
    {
        yield MessageClass::class => [
            'bus' => 'shared.message.bus',
        ];
    }

}

danielkorytek/messenger-bridge-bundle 适用场景与选型建议

danielkorytek/messenger-bridge-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 39.06k 次下载、GitHub Stars 达 1, 最近一次更新时间为 2020 年 10 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 danielkorytek/messenger-bridge-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 danielkorytek/messenger-bridge-bundle 我们能提供哪些服务?
定制开发 / 二次开发

基于 danielkorytek/messenger-bridge-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 39.06k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 15
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 2
  • Forks: 2
  • 开发语言: PHP

其他信息

  • 授权协议: proprietary
  • 更新时间: 2020-10-27