symbiote/silverstripe-sqs-jobqueue
Composer 安装命令:
composer require symbiote/silverstripe-sqs-jobqueue
包简介
A module for interacting with AWS's Simple Queue Service (SQS)
README 文档
README
A module for sending and consuming SQS tasks. Can be configured to work as the trigger for queuejobs.
When used as the queuedjobs handler, there's a few slight changes to how queuedjobs are run - aside from not needing Cron jobs anymore.
- On calling QueuedJobService->queueJob, a message is sent to SQS
- A consumer picks up that message, then processes that job ID
- All "type 1" aka immediate jobs are subsequently processed in that execution thread
- If the added job is meant to be run in the future, the handler sets the job type to 'Scheduled'.
- A separate SQS task runs that looks for any jobs of type "Scheduled" and executes those
- That task re-queues itself for to run again in 30 seconds time
- The "Scheduled" task runner will also look for any job currently sitting in the "wait" status; this is how paused jobs get picked up for further execution without needing to trigger another SQS message
Configuration for use as the queuejobs handler
---
Name: jobrunner
After: queuedjobs
---
SilverStripe\Core\Injector\Injector:
QueueHandler:
class: Symbiote\SqsJobQueue\Service\SqsQueueHandler
properties:
sqsService: '%$SqsService'
SqsClient:
class: Aws\Sqs\SqsClient
constructor:
connection_details:
region: ap-southeast-2
version: latest
credentials:
key: YourKey
secret: YourSecret
That expects a queue to exist with the name 'jobqueue' - if the queue name is different,
SilverStripe\Core\Injector\Injector:
SqsService:
properties:
queueName: your-queue-name
Writing a task
Define a class with a method in it. This is the task runner; no need for any specific implementations.
eg
namespace \Whatever\Class\Implements; class Work { public function doStuff() { } }
Add configuration to your project that binds the method name to the SqsService
SilverStripe\Core\Injector\Injector: MyJobName: class: \Whatever\Class\Implements\Work SqsService: properties: handlers: doStuff: %$MyJobName
Triggering tasks
To trigger a task, the call
$sqsService->sendSqsMessage(['args' => ['param1', 'param2']], 'taskName');
for convenience, SqsService implements a __call() method that remaps a call like
$sqsService->taskName($arg1, $arg2)
into
$sqsService->sendSqsMessage(['args' => [$arg1, $arg2']], 'taskName');
sendSqsMessage in turn converts this into a message structure such as
$message = [ 'message' => [ 'args' => [$arg1, $arg2'], 'handler' => 'taskName', ] ]; $sqsMessage = [ 'QueueUrl' => 'sqs://in.amazon' 'MessageBody' => json_encode($message) ];
So, to manually trigger the messages, create the $sqsMessage structure from
your own code, and send using $this->client->sendMessage($sqsMessage);
Running
php vendor/symbiote/silverstripe-sqs-jobqueue/sqs-worker.php
Development environments
If you don't have SQS available, you can run a file-based queue system by swapping out the AWS queue for the file based SQS queue.
---
Name: local_sqs_config
After: '#sqs_config'
---
SilverStripe\Core\Injector\Injector:
SqsService:
properties:
client: '%$FileSqsClient'
FileSqsClient:
class: Symbiote\SqsJobQueue\Service\FileBasedSqsQueue
By default, this will create serialised data in sqs-jobqueue/code/service/.queueus (configurable on the FileBasedSqsQueue class).
Run sqs-worker as before.
Docker
If you're using https://github.com/symbiote/docker-runtime, this will spin up an sqsrunner container for you that runs the sqs-worker automatically.
Troubleshooting
So for a project, your config may look something like this where it defaults to the file-based queue system only for test environments:
---
Name: prod_sqs
After: '#sqs_config'
---
SilverStripe\Core\Injector\Injector:
Symbiote\SqsJobQueue\Service\SqsService:
properties:
client: '%$SqsClient'
SqsClient:
class: Aws\Sqs\SqsClient
constructor:
connection_details:
region: ap-southeast-2
version: latest
---
Name: dev_sqs
After: '#sqs_config'
Only:
environment: test
---
SilverStripe\Core\Injector\Injector:
Symbiote\SqsJobQueue\Service\SqsService:
properties:
client: '%$Symbiote\SqsJobQueue\Service\FileBasedSqsQueue'
In the production environment you will still need to provide the credentials using local config.
To get the file-based queue system working, your local config will need something like this:
---
Name: jobrunner
After:
- queuedjobs
---
SilverStripe\Core\Injector\Injector:
QueueHandler:
class: Symbiote\SqsJobQueue\Service\SqsQueueHandler
properties:
sqsService: '%$Symbiote\SqsJobQueue\Service\SqsService'
Symbiote\SqsJobQueue\Service\SqsService:
properties:
queueName: '%sqs_jobqueue_name%'
---
Name: sqs_location
After: '#sqs_config'
---
SilverStripe\Core\Injector\Injector:
Symbiote\SqsJobQueue\Service\FileBasedSqsQueue:
properties:
queuePath: /var/www/html/mysite/fake-sqs-queues
The important part is making sure /var/www/html/mysite/fake-sqs-queues is writable since that's where your queued jobs will be written to.
Docker Testing
The simplest way to test this once all your configs are in place is to:
- Queue up a job (e.g. using the https://github.com/symbiote/silverstripe-queuedjobs/ module)
- Ensure a file is written to
/var/www/html/mysite/fake-sqs-queues - Run
docker logs sqsrunnerto see whether it picked up the job - View the queued jobs admin to ensure the job was completed
symbiote/silverstripe-sqs-jobqueue 适用场景与选型建议
symbiote/silverstripe-sqs-jobqueue 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 9.48k 次下载、GitHub Stars 达 2, 最近一次更新时间为 2017 年 06 月 30 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「aws」 「silverstripe」 「sqs」 「queuedjobs」 「thrive」 「symbiote」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 symbiote/silverstripe-sqs-jobqueue 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 symbiote/silverstripe-sqs-jobqueue 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 symbiote/silverstripe-sqs-jobqueue 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Laravel package that enables support for SQS FIFO Queue
This package includes a script and fail2ban configuration that allows you to use fail2ban when utilizing AWS elastic load balancer (ELB) and an apache webserver.
Elastic Driver for Laravel Scout
An extension to the Amazon SQS client that enables sending and receiving messages up to 2GB via Amazon S3.
simple api library.
统计信息
- 总下载量: 9.48k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 2
- 点击次数: 25
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2017-06-30