负载均衡如何设置中转tcp服务器(手机app控制设备)

by_封爱 版主 2015-10-12 10:12:15
先说下背景.物联网开发手机APP(简称app)控制设备(简称device) 流程是这样的.

我写了一个tcpserver 监听端口9999 device连接wifi之后tcp/ip长连接我的tcpserver:9999.并且发送一个唯一命令(mac)

app要控制这个device也是连接tcpserver:9999;发送一个不同于device命令的唯一命令.

所以目前tcpserver目前有2个在线的tcp/ip长连接 一来自app一来自device

这样三者之间形成一个"三角形"关系

app发送到tcpserver,tcpserver解析下找到要控制的device这个tcp/ip的实例(tcpclient)就可以实现控制

并且device发送数据到tcpserver我还可以通过"关系"找到这个app并且把数据发送过去.

完成一次查询或者控制

--------------------------------------------分割线-------------------------------------------------------

上面的东西我已经完成并且很稳定也已经应用到了很多"智能家居"的项目中

但是现在有这样一个问题..也就是客户端非常多...

因为在一个服务器的一个tcplistener(忘记怎么写了)毕竟维持不了那么多(大概几万?????不确定)

所以采用了"负载均衡"来做.

在"负载均衡"(简称SLB)的可视化页面我设置了TCP端口9998映射了服务器A的9999端口 服务器B的9999端口

AB服务器都有监听程序.

这样设备连接SLB的时候 不一定会分配到A或者B.但是能正常连接..

那么现在问题来了...这个时候APP也来连接SLB的9998 同样也随机分配A或者B

这个时候如果分配的服务器跟device连接的服务器在一台服务器上 上面代码是可以的.

如果一个A一个B 那么A在发送控制命令的时候 在A的"内存"中找那个device的长连接是不存在的...

因为这个时候device连接的是B服务器..

所以这个时候我该如何下手? 也就是 我要保证app的连接跟device的连接能"对应"上.

或者用一个什么办法能让不同服务器的"内存"数据共享?(数据库不行啦毕竟我这是list<socket>,我随时都用的)

或者大家有没有做过类似负载均衡的智能家居解决方案?
...全文
336 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-10-13
  • 打赏
  • 举报
回复
你这个有点像是搞成服务器集群的东西

你要做如下改进 增加中心服务器,



App或Drevice第一次连接时先连接网关分配服务器 连上后,通过中心服务器计算分配会回传一个指定的服务IP,然后断开这个网关分配服务器,改连接指定的服务,连上后服务X后 会通知中心服务器 目前这个服务的连接数量及所连接的对象是什么,中心服务器都要记录,这样便于不同服务之间的数据中转。
后面的那个服务器1,2,3 是做为处理业务的 好比说我发从App1去控制Drivice2:数据发送到服务1,先查找本机有没有目标对象要没找到,服务1 通过中心服务器查找目标服务器与目标连接端,找到后下发数据。。。

这样好处理把Socket连接能平均分配,如果中转到其他服务,压力会在中心服务器上会大一些。

ajianchina 2015-10-12
  • 打赏
  • 举报
回复
微软推出的分布式缓存解决方案VelocityCache你倒是可以了解一下 多数采用这种方式解决,网上的范例也是非常的多,按你的需求,真的实现起来没多少行代码。
  • 打赏
  • 举报
回复
你可以考虑将数据写入同一个缓存服务器,比如redis,另外,slb支持路由记忆(专业说法可能不是这样的),就是客户端请求来时,第一次slb分配给了A,第二次来时还是会分配给A,可惜我对这方面只是了解,没专业的运维了解的更多
cocoxox 2015-10-12
  • 打赏
  • 举报
回复
我就顶一下

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧