ozean12/googlepubsub

此包的最新版本(1.0)没有提供许可证信息。

与Google Cloud PubSub集成的Symfony 2/3集成

1.0 2019-07-22 10:14 UTC

README

Build Status Scrutinizer Code Quality Latest Stable Version Total Downloads

Ozean12GooglePubSubBundle

一个将Google Cloud Pub Sub与您的应用程序集成的Symfony 2 / Symfony 3包。

安装

1. 需求包
composer require ozean12/googlepubsub
2. 设置
// app/AppKernel.php

public function registerBundles()
{
    $bundles = [
        // ...
        new JMS\SerializerBundle\JMSSerializerBundle(), // if not already enabled
        new Ozean12\WebTranslateItBundle\Ozean12WebTranslateItBundle(),
    ];
    
    // ...
}
# app/config/config.yml

ozean12_google_pub_sub:
  # your Google Cloud Project ID
  project_id: "%google_pub_sub_project_id%"
  
  # path to your Google Cloud Application Credentials file
  key_file_path: "%google_pub_sub_key_file_path%"
  
  # add this if you want to use logger (see Using Logger section for more info)
  logger_channel: pub_sub
  
  # list of PubSub topics (See Publishing section for more info)
  topics:
    - my_topic
    
  # list of Push subscriptions in format (subscription_name: service_name) (see Subscribing to Push messages section for more info)
  push_subscriptions:
    my_push_subscription: my_bundle.my_firts_push.subscriber

使用方法

1. 发布消息

为了将消息发布到PubSub,您需要首先定义主题,如前节所述。一旦主题定义,它就可以在Publisher服务中访问。

$message = new MyTopicMessage();
$publisher = $this->container->get('ozean12_google_pubsub.publisher.my_topic');
$result = $publisher->publish($message);

MyTopicMessage 是一个简单的类,它实现了 Ozean12\GooglePubSubBundle\DTO\MessageDataDTOInterface 接口,并持有需要包含在消息中的数据。

publish 方法还接受 attributes 数组作为第二个参数。

如果主题不存在,它将被自动创建。

调用结果将是一个 Ozean12\GooglePubSubBundle\DTO\PublishMessageResultDTO 的实例,它将包含创建的消息的ID。

2. 订阅推送消息

当使用推送订阅时,您需要创建一个端点,该端点将接收来自Google Pub/Sub的消息,然后将其传递给 PushSubscriberManager。此主题超出了包的范围。使用 FOS REST Bundle 的此设置示例

// GoogleCloudController.php

use Ozean12\GooglePubSubBundle\DTO\PushMessageRequestDTO;

/**
 * Class GoogleCloudController
 *
 * @Version("v1")
 * @Route("/google-cloud/")
 */
class GoogleCloudController extends FOSRestController
{
    /**
     * @ApiDoc(
     *   resource = true,
     *   description = "Receive a new PubSub message and process it",
     *   statusCodes = {
     *     204 = "Returned when successful",
     *     403 = "Returned when access denied"
     *   }
     * )
     *
     * @ParamConverter("message", converter="fos_rest.request_body")
     *
     * @Route("pub-sub")
     * @Method({"POST"})
     * @View()
     *
     * @param PushMessageRequestDTO $message
     * @return mixed
     */
    public function pubSub(PushMessageRequestDTO $message)
    {
        $this->get('ozean12_google_pubsub.push_subscriber_manager.service')->processMessage($message);
    }
}

通过使用 @ParamConverter 注解,Symfony 将自动将请求转换为 PushMessageRequestDTO

PushMessageRequestDTO 有两个属性

  • message: PushMessageDTO 的实例。有关所有字段的详细信息,请参阅 推送请求数据
  • subscription: Pub/Sub 订阅名称的字符串

PushSubscriberManager->processMessage() 方法将遍历所有已注册的订阅者,并运行名称与消息的订阅属性相等的订阅者。订阅者的示例

// MyPushSubscriber.php

use Ozean12\GooglePubSubBundle\DTO\PushMessageDTO;
use Ozean12\GooglePubSubBundle\Service\Subscriber\PushSubscriberInterface;

/**
 * Class MyPushSubscriber
 */
class MyPushSubscriber implements PushSubscriberInterface
{
    /**
     * {@inheritdoc}
     */
    public function process(PushMessageDTO $message)
    {
        /** @var SendTransactionalEmailDataDTO $emailDTO */
        $data = base64_decode($message->getData())

        // process your data here
    }
}

3. 使用日志记录器

如果您想记录与Google服务的交互,请使用您想要使用的通道设置 logger_channel 选项。例如

monolog:
  handlers:
    # ...
    pub_sub:
      type:  stream
      path:  "%kernel.logs_dir%/pub_sub_%kernel.environment%.log"
      level: info
      channels: [pub_sub]
  channels:
    # ...
    - pub_sub
    
ozean12_google_pub_sub:
  # ...
  logger_channel: pub_sub

这将产生以下日志条目

[2016-12-23 17:51:42] pub_sub.INFO: New topic my_topic created {"topic":"my_topic"} []
[2016-12-23 17:57:01] pub_sub.INFO: Message(s) 123456789 submitted to topic my_topic {"messages":"123456789","topic":"my_topic"} []
[2017-01-04 15:57:32] pub_sub.INFO: Received message : my_first_subscription[123456789]; Processed with MyBundle\Service\GooglePubSub\Subscriber\MyFirstSubscriber subscriber {"message":"123456789","subscription":"my_first_subscription","subscriberClass":"MyBundle\\Service\\GooglePubSub\\Subscriber\\MyFirstSubscriber"} []

致谢

Ozean12