当前位置: 首页 > 知识库问答 >
问题:

socket.io如何处理docker部署的多个实例?

乌骏
2023-03-14
const express = require('express');
var io = require('socket.io');
var app = express();
app.get('/', (req, res) => {
   res.sendFile(__dirname + '/index.html');
})
var server = require('http').createServer(app);

io = io.listen(server);


io.on('connection', function(socket){
    console.log('user connected', socket.id)
    socket.on('chat message', function(msg){
    console.log(socket.id, 'message: ' + msg);
   });
});

server.listen(9999)

这是我的Compose.yml

version: '3'
services:
  web:
  image: socket:v2
  ports:
    - "5000:9999"
    command: node index.js
    deploy:
    replicas: 2

我遇到一些问题,当发送消息到服务器时,server1显示连接,并显示GET消息,但下次发送时,server2显示GET消息

如何使其成为“我连接的服务器就是我发送消息到的服务器”?

共有1个答案

马坚
2023-03-14

可以使用jwilder/nginx-proxy。它是使用docker-gen的Docker容器的自动Nginx代理。

用法

运行它:

$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
$ docker run -e VIRTUAL_HOST=foo.bar.com 
version: '2'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  whoami:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=whoami.local

这里jwilder/whoami将由jwilder/nginx-proxy代理为其指定的virtual_host

您可以在这里和这里阅读更多关于jwilder/nginx-proxy的信息

此外,您还可以检查这个docker-compose-scale-wit-sticky-sessions

docker-compose up
curl -H "Host: whoami.local" localhost

现在,是时候扩大规模了

docker-compose scale whoami=3

现在查看来自不同容器的屏幕截图响应。

要处理粘滞会话,可以使用TPCWang的fork允许您在容器级别上使用ip_hash指令来启用粘滞会话。

    null

下面的示例演示如何使用客户端IP哈希来配置粘性会话。这不像cookie那样灵活或一致,但为一些不能使用其他方法的应用程序提供了变通方法。当使用IP散列时,请重新配置互锁代理以使用主机模式网络,因为默认的入口网络模式使用SNAT,这将模糊客户端IP地址。

创建覆盖网络,以便隔离和安全服务通信:

$> docker network create -d overlay demo

使用cookie创建一个服务,用于使用IP散列的粘性会话:

$> docker service create \
    --name demo \
    --network demo \
    --detach=false \
    --replicas=5 \
    --label com.docker.lb.hosts=demo.local \
    --label com.docker.lb.port=8080 \
    --label com.docker.lb.ip_hash=true \
    --env METADATA="demo-sticky" \
    ehazlett/docker-demo
 类似资料:
  • 我需要部署同一个LAMP(或LEMP)应用程序的许多实例: 每个实例都可以通过前端LoadBalancer/Proxy从子域访问 每个实例必须有自己的db数据和文件数据。 可以监视每个实例 可以为每个应用程序实例设置内存限制/cpu 易于自动部署新webapp实例 环境可以很容易地进行测试和开发。 应用程序要求: null null 示例: > 为Wordpress应用程序提供了一个多功能容器:h

  • 问题内容: 我需要部署同一LAMP(或LEMP)应用程序的许多实例: 每个实例都可以使用前端负载均衡器/代理从一个子域访问 每个实例必须具有自己的数据库数据和文件数据。 每个实例都可能受到监视 内存限制/ CPU可能会针对每个应用实例设置 易于自动化新的Webapp实例的部署 测试和开发环境可能很容易重现。 申请要求: dameon过程(,,) 二进制文件(,,…) 其他系统特定的库和配置 阅读D

  • 我正在使用socket.io构建一个应用程序 我正在使用Socket.io的房间功能,用户可以订阅5个“主题”。该主题中广播的每个消息都有一个消息类型,其中有100个。用户将只接收他们允许接收的类型的消息,这可能在30到70之间。 我的问题是:为每个主题+消息类型组合创建一个房间是否可行,这将是5×100个房间?socket.io会像这样表现良好吗?还是有更好的方法来解决这个问题?向每个单独的套接

  • 我是JPA的新手,有一个关于如何处理实体的问题。在我的例子中,我有3个实体:用户、组和事件。 一个事件总是属于一个组。这意味着有一个OneToMulti-Relation。一个用户可以订阅多个组,这意味着有一个ManyToMulti-Relation。现在我遇到麻烦的部分。一个用户也可以订阅多个事件,这意味着也有一个ManyToMulti-Relation。 现在我的问题是。我如何在我的组实体中列

  • 问题内容: 我试图了解哪些是应用程序的“物理”限制。 在客户端: 在服务器端: 在OSX中达到文件限制(256)时,统计信息如下 让我感到困惑的是: 如果我强行关闭连接(这是我想对客户端执行的操作,为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)? 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可

  • 问题内容: 尽管我有很多编写代码的经验。我真的没有太多的部署经验。我正在编写一个项目,该项目使用mongodb进行持久化,使用redis进行元缓存,并使用其播放页面。我正在决定是否要购买专用服务器,还是要从亚马逊/ linode购买多个小型/中型实例(每个,mongo,redis,play一次)。我想到了以下折衷方案,我想知道是否有人可以添加到列表中或提供进一步的见解。我倾向于(b)从linode