inspirum / mcrouter
Requires
- php: >=7.1
- ext-memcached: *
- illuminate/cache: ^5.3|^6.0|^7.0|^8.0
- illuminate/session: ^5.3|^6.0|^7.0|^8.0
- illuminate/support: ^5.3|^6.0|^7.0|^8.0
Requires (Dev)
- mockery/mockery: ^1.2
- phpstan/phpstan: ^0.12
- phpstan/phpstan-mockery: ^0.12
- phpunit/phpunit: ^7.0|^8.0|^9.0
- squizlabs/php_codesniffer: ^3.3
This package is auto-updated.
Last update: 2024-09-18 19:37:16 UTC
README
由 inspishop 电子商务平台开发团队 inspirum 创建,作为其一部分。
Memcached 缓存存储实现,用于 Laravel 框架,优化以与 Mcrouter 一起使用。
- 静态缓存 标签 以减少对 Memcached 服务器的查询次数
- 支持 Mcrouter 前缀路由
- 优化以在 Kubernetes 集群中使用,每个节点上都有 Memcached 服务器,以实现最低延迟
系统要求
安装
composer require inspirum/mcrouter
此包支持 Laravel 5.3 或更高版本(包括 Laravel 6/7/8)。
对于 Laravel 5.4 及以下版本,需要在 config/app.php
中注册服务提供者。
'providers' => [ // ... Inspirum\Mcrouter\Providers\McrouterServiceProvider::class, ]
在较新版本中,Laravel 将通过 包发现 自动注册。
配置文件
要编辑默认配置,您可以执行
php artisan vendor:publish --provider="Inspirum\Mcrouter\Providers\McrouterServiceProvider"
之后,将创建 config/mcrouter.php
。
<?php return [ 'shared_prefix' => '/default/shr/', 'prefixes' => [ '/default/a/', '/default/b/', '/default/c/', ], ];
或者,您可以使用环境变量
CACHE_MCROUTER_SHARED_PREFIX='/default/shr/' CACHE_MCROUTER_PREFIXES='/default/a/,/default/b/,/default/c/'
使用示例
缓存标签将自动使用 Mcrouter 共享前缀进行前缀。
CACHE_PREFIX='__prefix__' CACHE_MCROUTER_SHARED_PREFIX='/default/shr/'
cache()->tags(['bop', 'zap'])->get('foo');
get /default/shr/__prefix__:tag:bop:key
get /default/shr/__prefix__:tag:zap:key
get __prefix__:foo
包支持额外的前缀,可以在 Mcrouter 路由前缀中使用。
CACHE_PREFIX='__prefix__' CACHE_MCROUTER_PREFIXES='/default/a/,/default/b/'
cache()->get('/default/a/foo'); cache()->get('/default/b/foo'); cache()->get('/default/c/foo');
get /default/a/__prefix__:foo
get /default/b/__prefix__:foo
get __prefix__:/default/c/foo
缓存标签静态缓存
cache()->tags(['bop', 'zap'])->get('bar1'); cache()->tags(['bop'])->get('bar2'); cache()->tags(['bop', 'zap', 'foo'])->get('bar3');
get tag:bop:key
get tag:zap:key
get bar1
get bar2
get tag:foo:key
get bar3
Mcrouter 配置
此配置示例适用于多个 Memcached 服务器,其中一个是本地的,例如典型的 Kubernetes 集群。如果可能,我们只想使用本地服务器(在 pod 相同节点上),以实现最低延迟,但要在每个服务器上无效化缓存键。
带标签的缓存刷新方法(cache()->tags(['bop', 'zap'])->flush()
)不使用 Memcached 服务器上的 delete
操作,而是更新标签缓存值。
带有共享前缀(/default/shr/
)的所有操作和所有 delete
操作都发送到每个节点上的 AllFastestRoute
处理程序,其余操作仅发送到本地服务器(使用 PoolRoute
处理程序)。
您可以使用
AllSyncRoute
或AllAsyncRoute
处理程序而不是AllFastestRoute
。
{ "pools": { "local": { "servers": [ "127.0.0.1:11211" ] }, "nodes": { "servers": [ "10.80.10.1:11211", "10.80.10.2:11211", "10.80.10.3:11211" ] } }, "routes": [ { "aliases": [ "/default/local/" ], "route": { "type": "OperationSelectorRoute", "default_policy": "PoolRoute|local", "operation_policies": { "delete": "AllFastestRoute|Pool|nodes" } } }, { "aliases": [ "/default/shr/" ], "route": "AllFastestRoute|Pool|nodes" } ] }
Kubernetes 示例
在三个节点(10.80.10.1
、10.80.10.2
、10.80.10.3
)的 Kubernetes 集群上使用 Memcached 和 Mcrouter 的示例。
使用 DaemonSet
资源确保 Memcached 和 Mcrouter 将在每个服务器上可用(在端口 11211
和 11212
上)。
apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: memcached spec: template: spec: containers: - name: memcached image: memcached:1.5-alpine command: ["memcached"] ports: - name: memcache containerPort: 11211 hostPort: 11211
apiVersion: v1 kind: ConfigMap metadata: name: mcrouter data: config.json: |- { "pools": { "local": { "servers": [ "$HOST_IP:11211" ] }, "nodes": { "servers": [ "10.80.10.1:11211", "10.80.10.2:11211", "10.80.10.3:11211" ] } }, "routes": [ { "aliases": [ "/default/local/" ], "route": { "type": "OperationSelectorRoute", "default_policy": "PoolRoute|local", "operation_policies": { "delete": "AllFastestRoute|Pool|nodes" } } }, { "aliases": [ "/default/shr/" ], "route": "AllFastestRoute|Pool|nodes" } ] }
kind: DaemonSet metadata: name: mcrouter spec: template: spec: volumes: - name: config emptyDir: {} - name: config-stub configMap: name: mcrouter initContainers: - name: config-init image: alpine:latest imagePullPolicy: Always command: ['sh', '-c', 'cp /tmp/mcrouter/config.json /etc/mcrouter/config.json && sed -i "s|\$HOST_IP|${HOST_IP}|g" /etc/mcrouter/config.json'] env: - name: HOST_IP valueFrom: fieldRef: fieldPath: status.hostIP volumeMounts: - name: config-stub mountPath: /tmp/mcrouter - name: config mountPath: /etc/mcrouter containers: - name: mcrouter image: mcrouter/mcrouter:latest imagePullPolicy: IfNotPresent command: ["mcrouter"] args: - --port=11212 - --config-file=/etc/mcrouter/config.json - --route-prefix=/default/local/ - --send-invalid-route-to-default volumeMounts: - name: config mountPath: /etc/mcrouter ports: - name: mcrouter containerPort: 11212 hostPort: 11212
您可以使用 status.hostIP
将当前节点 IP 注入 pod,以连接到本地 Memcached/Mcrouter 服务器。
kind: Deployment metadata: name: example spec: template: spec: containers: - name: example image: alpine:latest env: - name: MCROUTER_HOST valueFrom: fieldRef: fieldPath: status.hostIP - name: MCROUTER_PORT value: "11212"
测试
要运行单元测试,请执行
composer test:test
要显示覆盖率,请执行
composer test:coverage
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT。
安全性
如果您发现任何安全相关的问题,请通过电子邮件 tomas.novotny@inspirum.cz 而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。