承接 coding-linheng/hyperf-rocketmq 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

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

coding-linheng/hyperf-rocketmq

Composer 安装命令:

composer require coding-linheng/hyperf-rocketmq

包简介

hyperf 的 aurocketmq 组件

README 文档

README

基于阿里云的rocketmq-php-sdk 修改的 hyperf2.2 的 rocket 组件

任何问题请加QQ群提问:873213948

安装 - install

$ composer require coding-linheng/hyperf-rocketmq

发布配置 vendor:publish

php bin/hyperf.php vendor:publish coding-linheng/hyperf-rocketmq

使用

以下是伪代码,仅供参考

<?php

declare(strict_types=1);

namespace App\Controller;

use Codelin\HyperfRocketmq\Client;
use Hyperf\HttpServer\Annotation\AutoController;
use MQ\Exception\MessageNotExistException;
use MQ\Model\Message;
use MQ\Model\TopicMessage;
use MQ\MQConsumer;
use MQ\MQProducer;
use Psr\Container\ContainerInterface;

#[AutoController]
class IndexController extends AbstractController
{
    protected MQProducer $producer;

    protected MQConsumer $consumer;

    public function __construct(ContainerInterface $container)
    {
        $this->producer = $container->get(Client::class)->getProducer();
        $this->consumer = $container->get(Client::class)->getConsumer();
    }


    public function testProducer()
    {
        try {
            for($i = 1; $i <= 8; $i++) {
                $publishMessage = new TopicMessage(
                    "test"// 消息内容
                );
                // 设置属性
                $publishMessage->putProperty("a", $i);
                // 设置分区顺序KEY
                $publishMessage->setShardingKey($i % 2);
                // 设置tag
                $publishMessage->setMessageTag('hyperf-test');
                $result = $this->producer->publishMessage($publishMessage);
                print "Send mq message success. msgId is:" . $result->getMessageId() . ", bodyMD5 is:" . $result->getMessageBodyMD5() . "\n";
            }
        } catch (\Exception $e) {
            print_r($e->getMessage() . "\n");
        }
    }


    public function testConsumer()
    {
        while(True) {
            try {
                // 长轮询消费消息
                // 长轮询表示如果topic没有消息则请求会在服务端挂住3s,3s内如果有消息可以消费则立即返回
                $messages = $this->consumer->consumeMessage(
                    5, // 一次最多消费3条(最多可设置为16条)
                    3 // 长轮询时间3秒(最多可设置为30秒)
                );
            } catch (\Exception $e) {
                if ($e instanceof MessageNotExistException) {
                    // 没有消息可以消费,接着轮询
                    printf("No message, contine long polling!RequestId:%s\n", $e->getRequestId());
                    continue;
                }

                print_r($e->getMessage() . "\n");

                sleep(3);
                continue;
            }

            var_dump($this->consumer->getMessageTag());
            var_dump($messages);
            print "consume finish, messages:\n";

            // 处理业务逻辑
            $receiptHandles = array();
            /** @var Message $message */
            foreach($messages as $message) {
                $receiptHandles[] = $message->getReceiptHandle();
                printf("MessageID:%s TAG:%s BODY:%s \nPublishTime:%d, FirstConsumeTime:%d, \nConsumedTimes:%d, NextConsumeTime:%d,MessageKey:%s\n",
                    $message->getMessageId(), $message->getMessageTag(), $message->getMessageBody(),
                    $message->getPublishTime(), $message->getFirstConsumeTime(), $message->getConsumedTimes(), $message->getNextConsumeTime(),
                    $message->getMessageKey());
                print_r($message->getProperties());
            }

            // $message->getNextConsumeTime()前若不确认消息消费成功,则消息会重复消费
            // 消息句柄有时间戳,同一条消息每次消费拿到的都不一样
            print_r($receiptHandles);
            try {
                $this->consumer->ackMessage($receiptHandles);
            } catch (\Exception $e) {
                if ($e instanceof AckMessageException) {
                    // 某些消息的句柄可能超时了会导致确认不成功
                    printf("Ack Error, RequestId:%s\n", $e->getRequestId());
                    foreach ($e->getAckMessageErrorItems() as $errorItem) {
                        printf("\tReceiptHandle:%s, ErrorCode:%s, ErrorMsg:%s\n", $errorItem->getReceiptHandle(), $errorItem->getErrorCode(), $errorItem->getErrorCode());
                    }
                }
            }
            print "ack finish\n";
        }
    }


    public function testPackage()
    {
        var_dump($this->consumer);
        var_dump($this->producer);
    }
}

coding-linheng/hyperf-rocketmq 适用场景与选型建议

coding-linheng/hyperf-rocketmq 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 48 次下载、GitHub Stars 达 4, 最近一次更新时间为 2022 年 03 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「rocketMq」 「hyperf」 「hyperf-rocketmq」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

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

围绕 coding-linheng/hyperf-rocketmq 我们能提供哪些服务?
定制开发 / 二次开发

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

BUG 修复 & 性能优化

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

项目外包 & 长期维护

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

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

统计信息

  • 总下载量: 48
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 5
  • 点击次数: 5
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 4
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-03-23