问题标签 [sticky-session]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1186 浏览

kubernetes - 如何使用容器对具有(长期)粘性会话的应用程序进行零停机滚动更新

我试图弄清楚如何根据 JSESSIONID cookie 提供具有长期交互用户会话的 web 应用程序的零停机滚动更新,这些会话应该是粘性的。

出于这个(和其他)原因,我正在研究容器技术,比如 Docker Swarm 或 Kubernetes。

我很难找到关于如何:

  1. 确保新会话转到最新版本的应用程序
  2. 虽然现有会话仍由它们启动的任何版本的应用程序提供服务
  3. 关闭旧版本的所有会话后,正确清理旧版本

更多信息:

  • 请求链接到基于 JSESSIONID cookie 的会话
  • 会话可能会持续数天,但可以在 24 小时内从应用程序中终止它们(向用户发送通知以“再次注销/登录,因为有新版本或它们会在下午 12 点自动注销“ 例如)
  • 当然,对于每个版本的应用程序,已经有多个容器以负载平衡的方式运行
  • 我不介意容器总数的增长,例如,如果每个旧版本的容器都仍在运行,因为它们仍然会托管 1 个会话,而大多数用户已经在使用新版本的应用程序

所以,我对所需流程的想法是这样的:

  1. 安装新版本的应用程序
  2. 让所有新连接(没有设置 JSESSIONID cookie 的连接)转到新版本的应用程序一次
  3. 旧版本应用程序的容器不再提供会话,删除容器/....

正如我所提到的,我正在研究 Kubernetes 和 Docker Swarm,但对其他建议持开放态度,但最终解决方案应该能够在云平台上运行(目前使用 Azure,但未来可能会使用谷歌或亚马逊云)

任何指示/提示/建议或想法表示赞赏

保罗

编辑:回答@Tarun 问题和一般说明:是的,我不想停机。我设想的方式是托管旧版本的容器将继续运行以服务所有现有会话。旧服务器上的所有会话结束后,旧服务器将被删除。

新容器只会为在新版本推出后启动应用程序的用户提供新会话。

因此,举个例子: - 我在上午 9 点启动旧版本应用程序的新会话 A - 上午 10 点推出新版本。- 我继续使用会话 A,其仍然托管在运行旧版本的容器上。- 中午我去吃午饭并注销 - 因为我是连接到运行旧版本的容器的最后一个会话,容器现在将被销毁 - 下午 1 点我回来,重新登录并获得新版本的应用程序

说得通?

0 投票
2 回答
1479 浏览

node.js - 无法从本地主机访问 AWS EC2 服务器(卷曲超时)

我正在尝试使用 ngnix 代理 node.js 服务器。我的问题是我无法访问(curl 或 nginx)本地主机上的 node.js 服务器,

当它的 3000 端口对外开放时,我可以看到我的节点 js 服务器正在运行。但是 curl 和 nginx 无法访问它。

一件奇怪的事情是我们启动了一个 mongodb,并且可以在 localhost 上访问它而没有任何问题

我的实例 ID 如下: i-0fef394cbc350a4f4

这是找不到本地主机并因此超时的 nginx 服务器的链接:http: //ec2-54-246-136-64.eu-west-1.compute.amazonaws.com/

我找不到另一种方法来证明我们无法访问 curl localhost:3000

一个更奇怪的情况:我们在 beanstalk 实例上安装了节点代码。

我们从外部访问节点服务器:http ://share-place.eu-west-1.elasticbeanstalk.com:8081/

但是来自亚马逊的默认 nginx 会回复一条连接被拒绝的消息(对于我们可以从外部访问的公共资源)

/var/log/nginx/error.log

2017/04/21 14:32:19 [警告] 3360#0:在 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf:42 中重复 MIME 类型“text/html”:42 2017/04/21 14:37:48 [警告] 7358#0:在 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf:42 2017/04/21 14:38:41 中重复 MIME 类型“text/html” [错误] 7362#0: *1 连接() 连接到上游时失败(111:连接被拒绝),客户端:41.226.2.5,服务器:,请求:“GET / HTTP/1.1”,上游:“ http://127.0.0.1:8081/ ”,主机: “share-place.eu-west-1.elasticbeanstalk.com” 2017/04/21 14:38:41 [错误] 7362#0: *1 连接()失败(111:连接被拒绝)同时连接到上游,客户端:41.226.2.5,服务器:,请求:“GET /favicon.ico HTTP/1.1”,上游:“ http://127.0.0.1:8081/favicon.ico ”,主机:“share-place.eu-west-1.elasticbeanstalk.com”,推荐人:“http://share-place.eu-west-1.elasticbeanstalk.com/ " 2017/04/21 14:38:45 [错误] 7362#0: *1 connect() failed (111: Connection refused) while connection到上游,客户端:41.226.2.5,服务器:,请求:“GET / HTTP/1.1”,上游:“ http://127.0.0.1:8081/ ”,主机:“share-place.eu-west-1。 elasticbeanstalk.com"

0 投票
0 回答
208 浏览

heroku - 扩展时保留 Heroku 会话亲和性

根据Heroku 文档,当会话亲和性打开并且 Dynos(节点)的数量增加时,现有流量会均匀分布到新的 Dynos。

这会影响“旧” Dynos 的客户端被分配给他们之前未通信的 Dynos。这在缩小规模时是不可避免的,但在扩大规模时则不是必需的。

是否有可能阻止 Heroku 负载均衡器将现有会话分配给新的 Dynos,而不是将它们与原始会话保持一致?

0 投票
1 回答
3774 浏览

websocket - 如何将 Traefik 用于 WebSocket 后端

我正在尝试为 WebSocket 应用程序配置 Traefik,我只是尝试在 docker 上使用一个简单的 WS 应用程序:https ://hub.docker.com/r/jmalloc/echo-server/

为了测试它,我使用 Chrome SimpleWebSocketClient,所以如果我使用应用程序的 IP:Port,它可以正常工作。如果我添加 Traefik DNS 失败,我只是尝试使用其他 WS 服务器和客户端,但也失败了,所以这将是 Traefik 的东西。

我只是尝试使用 Traefik 版本:

这些是我的 Traefik 规则:

有什么问题吗?有什么推荐的反向代理吗?

0 投票
0 回答
63 浏览

java - 需要在包含 Remot EJB 的粘性会话中成为可序列化的 bean?

我试图在粘性会话中查找有关需要可序列化的 java bean 的信息?似乎是如果包含@remot EJB 必须是,但是¿这是真的吗?

0 投票
1 回答
71 浏览

apache - Mod cluster configuring sticky session attribute name

Is it possible to configure the sticky session attribute name in mod-cluster?

I need to use a name different to JSESSIONID.

I´ve tried

but didn't work.

0 投票
1 回答
698 浏览

tomcat - WebLogic 的作用是什么配置元素究竟是做什么的?

我们正在将一些遗留应用程序从 WebLogic 移植到 Tomcat。在 Web Logic 中,这些应用程序的 weblogic.xml 部署描述符中有以下内容:

不知何故,包含此元素允许应用程序通过响应将 cookie 发送回浏览器,从而启用粘性会话,这正是我们试图实现的。应用程序 servlet 中没有任何代码可以对 cookie 进行任何操作来实现这一点。我应该提一下,我们使用传统的外部负载平衡器来进行平衡,而不是任何容器选项。

现在我们转移到 Tomcat,我们希望保持相同的功能,希望通过类似的声明方式,而不需要更改代码。但是,似乎没有类似的描述符可以在 Tomcat 中执行此操作。

当我们在两种环境中测试应用程序时,我们发现

curl -c cookie {url}在 WebLogic 下的文件“cookie”中保存一个 cookie,但不在 Tomcat 下。

所以我想知道

  1. 如果可能的话,如何在不更改编码的情况下在 Tomcat 中实现相同的目标。
  2. 如果不可能,如何通过代码更改在 Tomcat 中实现相同的功能。换句话说,WebLogic 在这个部署描述选项的幕后做了什么?

我已经尝试对此进行研究,但没有找到任何关于该选项的作用的信息,只有关于如何设置该选项的信息,没有关于您可能想要使用它的原因的信息。请参阅WebLogic 文档

0 投票
2 回答
4156 浏览

amazon-web-services - 无法在 AWS 中获得粘性会话?

我有一个在 EC2 上的 tomcat 实例中运行的 Web 应用程序,我无法在我的一生中获得粘性会话来在负载均衡器上工作。我已经按照http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html中的所有步骤,尝试使用基于应用程序的(使用 JSESSIONID cookie)和时间-基于(使用 86400 秒)的方法,但无论哪种方式,它根本不起作用。同一用户不断在所有不同的节点周围反弹。每次他们点击网页上的新链接时,都会将他们反弹回主屏幕以再次登录。

我不知道为什么它不起作用。我对这些东西也不太了解(哎呀,直到 2 小时前,我什至不知道“粘性会话”是什么意思——不,我不能让别人去做)所以我'我也不确定从哪里开始调试它。

编辑:查看我的 cookie .. 每次我加载网站时,AWSELB cookie 似乎都会被删除和重写,而不是像预期的那样持续存在。

编辑 2:我的负载均衡器的 XML 配置:

编辑3:有人吗?请我越来越绝望我需要这个工作......

0 投票
0 回答
581 浏览

node.js - 共享相同 IP 地址的用户的 NodeJS 粘性会话

我们的NodeJS(使用套接字和 HTTP)项目正在被共享相同公共 IP 地址的用户(所有人都在同一个办公室、同一个网络工作)使用。我已经放置了一个粘性会话实现,它根据用户的公共 IP 地址生成一个哈希,然后为它分配一个节点工作者。这种粘性是socket.io工作所必需的。由于所有用户都共享相同的公共 IP 地址,因此哈希值始终相同,因此仅使用一名工作人员。所有其他工人都没有被使用:-(

由于我使用net.createServer带有选项的非常低级别的 NodeJS 的 API pauseOnConnect,我无法获取任何其他信息,例如标头、cookie 来为每个用户创建唯一的哈希。

问题:

  • 真的需要这种粘性吗?我socket.io-redis用来广播消息。不确定此适配器是否会帮助我处理套接字连接,并且不需要管理明确的粘性。我试过这个,但似乎没有工作。

  • 是否可以从发出的连接对象中读取标头/cookie net.createServer?我认为这是不可能的,因为它在这个级别上没有任何 HTTP 实现。

  • 是否可以利用http.createServerAPI 并将请求对象从主进程传递给工作人员。通过这种方式,我可以读取标题/cookie 并生成唯一的哈希。

  • 最坏的情况,是否可以在代理级别(使用nginx)覆盖客户端的 IP 地址并为每个用户设置一些虚拟的唯一 IP 地址。

0 投票
2 回答
1561 浏览

nginx - Nginx 负载均衡器(ip_hash)将所有流量发送到单个服务器

我们有一个供学生使用的在线测试应用程序。我们有 4 台不同的服务器和一个 Nginx,用于在所有 4 台服务器之间负载均衡流量。

由于我们的应用程序需要粘性会话(对于一个用户,所有请求都发送到一台服务器),所以我启用了 ip_hash 算法进行负载平衡。

现在我们遇到这样一种情况,所有学生都出现在计算机实验室进行在线测试,该计算机实验室为每个系统分配了私有 IP,并且全部通过一个具有公共 IP 的互联网网关。

现在,当学生出现在测试负载均衡器中时,所有学生都会获得相同的源 IP,并且由于 ip_hash,它会将所有流量发送到一台服务器。

如何解决这个问题?

我们保持具有相同负载分布的粘性会话。