类似于共享单车这种很多设备通过 TCP Socket 连接服务器,向服务器发送数据的场景,服务器该如何处理?

2017-04-07 16:31:52 +08:00
 qiayue
而且为了能够通过服务器下发命令到设备,以及为了设备能够实时传数据到服务器,连接都是长连接,并不是用完就关。
我现在用的方式是,来一个设备就开一个线程去处理,但是这样设备一多,内存占用就多。
我服务器用的是 JAVA 开发的 Socket Server 。
求思路,求框架。
9054 次点击
所在节点    问与答
28 条回复
manhere
2017-04-07 16:55:37 +08:00
可以参考下推送系统的做法
zts1993
2017-04-07 16:57:44 +08:00
搜 非阻塞 IO

java 的话 先看 NIO 然后 netty 这样的框架。。
一个连接一个线程是不行的。。。。。。。。。。。。
fyyz
2017-04-07 17:00:26 +08:00
异步非阻塞 io
tabris17
2017-04-07 17:04:46 +08:00
java 用 Netty 或者 Vert.x
zonghua
2017-04-07 17:19:17 +08:00
用 Netty 实现 MQTT 协议
wwqgtxx
2017-04-07 17:19:53 +08:00
java 用 netty , golang 直接用 goroutine , python 用 gevent 或者 tornado
VicYu
2017-04-07 17:34:30 +08:00
然后在 actor 化, 进入邪教
shoaly
2017-04-07 17:48:14 +08:00
如果不是 "真实时" 消息, http 维护成本低太多了.
wwqgtxx
2017-04-07 18:14:12 +08:00
@shoaly 你要在单片机或者 esp8266 之类的设备上自己实现一个 http 协议栈么😱
t123yh
2017-04-07 18:41:49 +08:00
@wwqgtxx 貌似直接 socket 收发字符串就可以了,也不复杂
cevincheung
2017-04-07 18:49:49 +08:00
-_- 现在单车都开始锁上加联网模块了吗?怎么联网的? GSM ?
yangff
2017-04-07 18:50:42 +08:00
@cevincheung 4g 吧
bianhua
2017-04-07 18:53:50 +08:00
@t123yh

其实是这样的:如果用 TCP 先实现个 HTTP 客户端(哪怕就是读连续两个\r\n ,完全不解析头,拿 FIN 当 EOF ),然后再在 HTTP 上实现类似 Websocket/Comet 的东西,肯定不如直接拿 TCP 传递通知方便+效率高,何况这可能是在单车附加的设备上。
qiayue
2017-04-07 18:55:19 +08:00
@cevincheung 4G 物联网卡,但是你硬件里的上网模块可以用 4G 的也可以用 2G 的。
移动的卡, 500M 流量, 5~9 块钱,看你拿的量多少
gamexg
2017-04-07 19:36:11 +08:00
@wwqgtxx http 不麻烦, https ...
server
2017-04-07 19:37:19 +08:00
有个东西 叫 gps
ryd994
2017-04-07 22:03:01 +08:00
关键是 event driven ,用 nio
楼上说 http 也并非没有道理, HTTP 的话就可以让 HTTP 服务器在前面挡并发连接。至少 Nginx 是个现成的 event driven 。你的程序可以忽略网络部分。部分实现一个 HTTP/0.9 协议栈其实很简单,你只要保证自己能和自己的服务器通讯就好。
最后,如果不是对实时性有高要求,也没有高频率的消息,真的没有必要长连接。否则客户端光是维持连接的流量就已经不少了。要么你别开 keepalive ,加大 timeout ,明显也不可取。
qiayue
2017-04-07 22:28:28 +08:00
@ryd994 设备运行在两种状态,一种是 25 秒发一次心跳,另一种是每隔 2 秒发一次数据
当然,最重要是的,服务器想要找设备的时候,需要随时能够找到
所以,必须长连接
qiayue
2017-04-07 22:29:20 +08:00
@server 通过 2G 网络或者 4G 网络连接服务器,向服务器发送设备的实时位置( GPS )
zonghua
2017-04-07 23:07:27 +08:00
@qiayue
@bianhua 窄带通信用 MQTT 最可靠最成熟

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/353250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX