代码之家  ›  专栏  ›  技术社区  ›  Dirk Boer

具有标头而不是Cookie的特定于目标的Azure Web App实例

  •  1
  • Dirk Boer  · 技术社区  · 3 年前

    缓存命中 .

    尽可能 .

    该应用程序是完全无状态的,但是让来自同一组的用户访问同一台服务器将显著提高所有实例的性能和内存负载。

    在加载主页时,我已经知道在XHR调用中要将该用户发送到哪个服务器。

    ARRAffinity 饼干 它们不是很好 在这种情况下几乎是不可能的(跨域,必须先进行服务器调用等),我强烈希望自己通过自定义头发送提示。

    我试图手动删除cookies并分配它们,但感觉非常粗糙 而且我还没有让它完全工作。 而且它不适用于XHR调用。

    是否可以通过 标题 曲奇 ?

    • 在这种情况下,分布式缓存不适用于我。我需要内存缓存的性能,而不需要额外的网络跳数和序列化/反序列化。
    • 这似乎可以通过应用程序网关实现,但它似乎需要大量额外的基础设施和资源 运动部件 而我所有的问题都可以通过发送 “对” 标题。
    • 我可以通过复制整个web应用程序并分配不同的主机名来解决这个问题。另外,这感觉就像添加了很多额外的运动部件,可能会断裂。此外,维护将更加困难和混乱,我失去自动缩放等。
    • 也许这可以通过Kubenetes/Docker Swarm类型的架构(没有经验)轻松解决,但由于这是一个大型遗留项目,而且我有一个非常严格的最后期限,所以我非常谨慎,不会在最后一刻做出如此戏剧性的改变。
    0 回复  |  直到 3 年前
        1
  •  2
  •   Evyatar Saias    3 年前

    如果我理解正确,您希望通过客户端应用程序并基于该代理通过连接到其他后端服务器来设置自定义头。

    我喜欢使用HAProxy,你也可以看看Nginx。 您可以从发行版的包管理器在linux上安装HAProxy,也可以使用可用的HAProxy docker容器。

    sudo pacman -S haproxy 
    sudo systemctl start haproxy
    

    haproxy.cfg 找到配置文件,然后复制我在下面发布的haproxy.cfg配置片段,而不是现有的默认配置。

    /etc/haproxy/haproxy.cfg

    为了在HAProxy中实现您想要的功能,您需要将所有客户端设置为与该主HAProxy服务器通信,然后该服务器将根据您可以在客户端设置的自定义头的值将连接转发到您拥有的不同后端服务器,例如 "x-mycustom-header: Server-one"

    下面是一个简单的HAProxy配置文件(HAProxy.cfg)设置示例,该文件只有两个后端服务器,但您可以添加更多。

    这里的逻辑是,所有客户端都会向侦听端口80的HAProxy服务器发出http请求,然后HAProxy会检查名为 x-mycustom-header '客户端添加并基于该值,它将客户端转发到 backend_server_one backend_server_two

    出于测试目的,HAProxy和两个后端位于同一个盒子上,但监听的端口不同。HAProxy在端口80上,server1在127.0.0.1:3000上,server2在127.0.0.1:4000上。

     cat haproxy.cfg
    #---------------------------------------------------------------------
    # Example configuration.  See the full configuration manual online.
    #
    #   http://www.haproxy.org/download/1.7/doc/configuration.txt
    #
    #---------------------------------------------------------------------
    
    global
        maxconn     20000
        log         127.0.0.1 local0
        user        haproxy
        chroot      /usr/share/haproxy
        pidfile     /run/haproxy.pid
        daemon
    
    frontend  main
        bind :80
        mode                 http
        log                  global
        option               httplog
        option               dontlognull
        option               http_proxy
        option forwardfor    except 127.0.0.0/8
        maxconn              8000
        timeout              client  30s
        use_backend backend_server_one if { req.hdr(x-mycustom-header) server-one }
        use_backend backend_server_two if { req.hdr(x-mycustom-header) server-two }
        default_backend      backend_server_one #when the header is something else default to the first backend
    
    backend backend_server_one
        mode        http
        balance     roundrobin
        timeout     connect 5s
        timeout     server  5s
        server      static 127.0.0.1:3000 #change this ip to your 1st backend ip address
    
    backend backend_server_two
        mode        http
        balance     roundrobin
        timeout     connect 5s
        timeout     server  30s
        server      static 127.0.0.1:4000 #change this ip to your 2nd backend ip address
    

    nc -l 3000 # in the first screen
    nc -l 4000 # in a second screen 
    

    sudo systemctl reload haproxy 为了确保HAProxy与您的新配置文件一起重新加载,您可以在端口80上发出http GET请求,并提供 标题。

    您将能够在侦听端口3000的netcat实例的输出中看到请求。 "x-mycustom-header: Server-two"

        2
  •  1
  •   Dirk Boer    3 年前