inspirum/mcrouter

v1.2.0 2020-09-18 10:45 UTC

This package is auto-updated.

Last update: 2024-09-18 19:37:16 UTC


README

inspishop 电子商务平台开发团队 inspirum 创建,作为其一部分。

Latest Stable Version Build Status Coverage Status Quality Score PHPStan Total Downloads Software License

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 处理程序)。

您可以使用 AllSyncRouteAllAsyncRoute 处理程序而不是 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.110.80.10.210.80.10.3)的 Kubernetes 集群上使用 Memcached 和 Mcrouter 的示例。

使用 DaemonSet 资源确保 Memcached 和 Mcrouter 将在每个服务器上可用(在端口 1121111212 上)。

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

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全性

如果您发现任何安全相关的问题,请通过电子邮件 tomas.novotny@inspirum.cz 而不是使用问题跟踪器。

致谢

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。