Web 服务器架构

很久以前,web服务器就是Apache,或者LAMP这样的标准组合。 手头一个嵌入式项目也直接叫做 web server, 把HTTP + 网页 + 请求处理作为web服务的全部集成在一个程序上了。翻看了一些稍微有些规模的网站,发现现在的web 服务架构已经和我以往所了解的有了很大的不同。在这里正好梳理一下相关的内容,也算是补一下全栈的web sever 技术知识(full stack knowledge of web server)的一部分。 继续阅读“Web 服务器架构”

初试物联网之远程温湿度计

将 NAS 的信息显示在面板上只能帮助家人在房间内了解信息,但更重要的是如何能够在远程获取房间内的状态呢?为了实现将远程房间内物理信息传送到云端,需要以下的几个环节相互配合

  • 物联网数据平台,作为云端保存和处理数据
  • 传感器,采集环境信息产生数据
  • 家庭网关,将传感器信息收集传送到云平台
Internet of Things
Internet of Things

随着软银宣布收购 ARM 在物联网大展拳脚,Iot 这个不断翻炒的菜也在不断升温,国内除了百度物接入阿里云,流行的物联网数据平台中 Yeelink乐联网算是比较典型解决方案。他们都提供了通过 HTTP 访问的 RESTful API 将分布在各处的数据传送到他们的数据平台上,这种开发方式对绝大多数不会产生大量数据的小客户进行快速开发是非常方便的,下面的代码就能说明。不过周末尝试了好久,就是无法在 Yeelink 上成功的注册帐号,只好转战乐联网了,不过由于 API 基本类似,即便是转平台也是非常快捷的。如果有虚拟主机,也可以自己直接采用开源的 opensensordata.net 搭建一个云端的数据平台。

继续阅读“初试物联网之远程温湿度计”

工业以太网的一点思考

当下,工业以太网可以说是以势不可挡的趋势在四处蔓延。所有重量级的工厂自动化设备供应商都推出了自己的工业以太网解决方案和丰富的产品。连很多客户都从质疑转变了殷切的期望。一个大一统的自动化通讯网络标准呼之欲出。在这种热闹的背后,我们是不是缺少一些冷静的思考——以太网存在已经几十年,为什么这样一种成熟的技术,现在才开始在工业界慢慢的转热呢?

在笔者看来,限制以太网在工业界大展拳脚的条件主要有以下这些

  • 通讯的实时性,工业界的设备实时通讯是必要特性。
  • 成本,包含设备、材料,以及设计、实施的总成本。
  • 统一的标准,无论各家的设备都可以自由的交换数据。
  • 必要性,真的有必要将工业设备连接到互联网(Internet, Intranet)中吗?

目前市面上现场级别的通讯总线,基本上架构于RS-485(MODBUS RTU, PROFIBUS, USS)和CAN(CANopen,DeviceNet)两种标准上。而这两种大有廉颇老矣的标准,却可以充分满足以上的要求,所以也屹立工业界多年不倒。

而以太网呢?

TCP/IP协议的设计并不是以实时通讯为基础所设计的。当我们点击desiyi.com上的链接的时候,并不能知道服务器什么时候能给出反应。在TCP/IP协议栈上,从链路层,IP层,TCP层到应用层,都没有太多考虑实时通讯。即便是后来考虑到实时数据传输(RTP),以及QoS(Quality of Service)管理中,TCP/IP也只能保证“尽可能”的让数据传输的实时性得到保证。所以,为了实现实时通讯这个工业通讯的第一要求,工业界不得不改造已经存在多年的以太网标准,从底层开始对协议进行修正来保证连接到这个网络的几千个设备能够高效的实时交换数据。而以往的现场总线中节点的数量则不过是几百个。

为了实现实时通讯,只有改造TCP/IP协议的底层,从硬件层面重新设计来保证部分关键流量的实施传输。目前市面上所有廉价的商用以太网设备都是无法支持这种从底层协议栈修改过的以太网通讯的。而这种专用硬件设备的要求,也就造成了设备成本的急剧增加。

所有IT技术所依赖的都是芯片。而芯片的价格则依赖于产量。现在我们能够享受到几十块钱的路由器和网络设备,正是因为此类设备所使用的通用网络处理器的产量综合是非常惊人的。每个安装宽带的家庭,其实来就是分担这部分制造成本的一部分。但,工业以太网如果使用专用硬件,所面对的挑战就是制造成本无法和民用网络一样具备价格优势。如果各个厂家都使用自己的硬件平台,其制造成本将更高。

这就引出了最关键的话题——统一的工业以太网标准。

目前,工业以太网已经不是以前PROFIBUS那样神秘的通讯协议了。我们在电视、新闻上看到的关于“物联网(Internet of Thing)”的报道,其实来就包含了工业以太网。只不过“物联网”的含义更加宽泛,不仅工业设备要联网,连家里的家电,农业机械,楼宇设备都要联起来。工业界的西门子罗克韦尔分别开发了自己的工业以太网标准和设备。后起的通用电气公司通过挖掘硅谷IT人力资源的方式,组建了一个400人的团队进行这方面的研发。IBM的“智慧地球”项目算是一个概念,而网络巨头思科和高通更是早早就提出了“Internet of Everything”的理念,并大力开始推进实施。所有的工业巨头都意识到互联网的革命将改变工业格局,只是他们没有想好怎么来一起进行这场伟大的变革。

就像是“互联网”这个名字一样,这应该是一个大一统的网络。所有设备可以在上面自由的获取想要的数据。控制器,可以连接到工厂任何角落的传感器,控制车间里面的每一个马达速度。但前提是,他们必须说一种语言。而现况是,各个工业巨头发明的各种方言之间确实无法交流的。这就像圣经里面巴比塔的故事。如果世界上工业界讲述同一种语言,也许我们就能改变整个工业界,但目前为止这种交流被扰乱着,远远达不到我们想要的效率。

在这种吵吵闹闹的纷争中,其实来有一个被遗忘的命题——到底这些工业设备需要不需要接入到互联网中?

从效率上讲,一个TCP/IP报文的长度最短也有近70个字节。而工业设备中简单的设备中使用的报文通常只有七八个字节。虽然以太网可以达到100M/s,但分给更多的设备,每个设备占用更多的报文空间后,其网络利用率并没有显著的提高。而频繁的握手、冲突解决等活动更是降低了实际网络传输带宽。大量简单的设备驳接进以太网,公用一个网络介质进行频繁的数据交换,总体效率并不高。

此外消费领域的互联网运营模式也无法生搬硬套进工业领域。比如数据的产生和消费模式在互联网中主要有三种:服务器=》客户端;客户端《=》服务器;客户端《=》客户端。分析一般用户带宽比例,我们可以知道客户端主要是一个数据消费者。比如web应用中,浏览器主要的作用是下载网页。但工业中,更多的数据是来自末端的传感器和各种简单设备的,位于中心的控制器则负责发号施令。所有设备都一拥而上去请求控制器,则造成不必要的网络负担。如果服务器去一一查询末端设备,则效率低下。如果各个客户端之间自由交换数据,则单个末端设备的设计复杂性和成本会提高。

另据报道,一个意大利的安全公司在几小时内就可以发现SCADA系统大量的安全隐患。大量的工业控制软件是为特定用户特别开发的,没有大量用户的测试基础。更大量的安全隐患是否存在。这不由的让人疑惑,如果接入外部网络,像是破坏伊朗核设施的震网病毒是不是就可以轻而易举的控制工业设备?

如果回头十几年前,我们对现在的互联网是不是也有一样的困扰。交换机曾经还是一个稀罕物,路由器指的是那种几千块的铁盒子。慢的不能再慢的网络带宽里面,各家使用奇奇怪怪的协议通讯,就算是HTTP也会出现完全不同标准下设计的浏览器问题。网络安全问题让各个杀毒软件公司赚的盆满钵满。我们还自信满满的说,手机就是打电话和发短信的,要上网功能干什么。

这并不是说我们无需担忧,同样的问题在工业界也一定有办法会解决,而是我们还看不到工业以太网有当年互联网一样解决问题的基础——庞大的用户群体。他们会一年半换一部手机,三年换一台电脑的速度推进互联网基础的变革。而工业界这样的前提却不存在。

所以这就注定了工业以太网要走一条和互联网完全不同的发展路线,一场自上而下的变革,一场巨头之间的博弈。而接下来的纪念这个伟大的博弈必将越来越激烈,也必将越来越精彩。

 

豆瓣电影投票的一些简单分析

不知道什么时候开始在豆瓣混了,从一个小众的图书分享网站,变成了今天很多人社交网络的必不可缺的一部分。个人来说,其实来很少在豆瓣里面的论坛里面发表太多的内容。更多的时间是在上面看书评,找电影的介绍。每次在电影院售票口还在低头找最近热播的电影到底哪一个值得我掏钱。

豆瓣电影的成功借鉴了不少IMDB的经验。特别是电影的评分系统,对于我这样懒得看网友评论,只想快点找值得一看消磨时间的人来说,真是非常高效的手段。阮一峰的博客中,对IMDB评分体系有一个非常详细的介绍,非常值得一看。而豆瓣的评分计算,也有人分析过。对于一般读者而言,只要相信这些设计好的算法可以有效的保证评分高的电影真的是非常好的电影就行了。比如我的一个目标就是,看过豆瓣250中所有的电影。

但每当我看完电影,来豆瓣给这部电影评分时,却有一些彷徨。到底是该给这部感觉一般的电影三颗星,还是四颗星呢?真是让我头疼的问题。真不知道其他人是不是也有类似的感觉:五颗星的评分方式其实来是很困难去做决定的。为了验证其他人是不是有类似的感觉,我决定看看大家都是怎么投票的。

为此,我不得不从豆瓣上获得一些数据。但豆瓣的API需要oAuth验证,编写这个接口的功夫和回答这个问题相比,实在是杀鸡用宰牛刀了。所以,我只好用了点偷懒的方法:

  • 使用浏览器作为客户端自动来读取豆瓣数据。我在GreaseMonkey上编写了一个脚本,可以在豆瓣电影下自动的读取电影页面,并读取想要的数据。
  • 让后让这个脚本将得到的数据通过AJAX的方式发送到数据Web服务器,并转存到数据库中。
  • Web服务器管理数据,并根据扫描的结果,告知脚本扫描每个电影关联的其他电影数据,如此周而复始。

详细的过程就不在这里详细的介绍了。我所需要的就是在能上网的地方开着浏览器,然后让电脑自己和远程的服务器自动扫描。半天后,我得到了将近七千部电影的数据,显然已经足够作为一个数据源对我上面的疑问进行一些分析了。

问题一:是不是所有的星级都有人选取?

很多人,像是我这样的选择困难症患者,基本上就只选1,3,5这三颗星——不喜欢,一般,太棒了!甚至更加极端一些,要么喜欢,要么痛恨。那是不是所有的人都是这么选取的呢?

答案是否定的。所有的星级都有人选取。投票评分的用户并没有我这样极端。投票的用户基本上是很连续分布的。关于这个分布的形状,我们接下来继续探讨。

问题二:大家是不是什么电影都要看呢?

在电影院门口掏手机看评分,然后买票的用户,基本上就不会去看那些评论很差的电影了。所以,豆瓣上的用户数量应该集中在好电影上。换一句话来说,也就是豆瓣用户会对那些最好的电影贡献最多的票房。

对这个问题的分析是,这个结论有一部分是正确的。参考上面的图,对于分数在5以及以下的用户数量只有全部投票的9%。也就是说,如果一部电影评分在三颗星一下基本上就不会有任何票房了,算上评论网站上水军的力量不可忽略。可以猜想,这些比“一般”还差的电影是没有方法生存下去的。

也许会有人说,这是因为很多电影没有公映,观众少,所以投票评论的数量也少。但我们如果看看TOP250里面那些8分,9分的电影,其实来很多都是没有在国内正式上映的,但还是有大量的拥趸。

另外,投票评论数量最多的是7分左右的电影。也就是说,国内最大的电影市场其实来就是这些看着还不错,但是还有些许遗憾的作品来支撑着的。他们虽然不是电影教科书里面的范例,但却是这个资本游戏中的赢家。

问题三:好电影真的不挣钱吗?

就像刚才的分析说的,用户数量最多的电影是7分左右的电影。那是不是说,9分的电影其实来不挣钱?

各档每部电影用户数量

答案是,这个猜测是错误的。因为上一个问题的分析没有考虑到一个前提——好的东西,总是稀缺的。那些最好的,评分在9分以上的作品在几千部电影中只有4%而已。所以,如果我们将每个级别上的投票人数平均到每个分数档次的每一部电影上,就得到了上面的图。

虽然9分电影数量上只有4%,可是它们的平均观众数量却远远超越所有其他分数档次的电影,并占据用户数量的10%。如果你是一个伟大的导演,一部精品的电影可能获得超过8分电影三倍的收入,而你本人也可能被写进教科书里面,被艺术学校的学生们传颂。

如果离经典还差一步,就可能立刻跌落到竞争激烈的红海中了。6到9分以下的电影占据了80%的市场份额,可以说,在这里面生存下来其实来一件艰难的事情。这部分市场就是我们在报纸,电视,广告上看到的主流市场,同时也占据了80%的用户数量。落在这个群体里面,主要的奋斗目标已经不是将电影做的完美了。而是如何将观众哄进电影院,不管他们出来后是给6分,还是8分,其实来都是差不多的。

小众市场是那些分数低于六分的电影。说实话,我自己也基本上没有看过几部这样的作品。中国没有B级片,很多这样的电影连将海报悬挂在电影院的机会都没有。那些读着大师名著,心怀理想的电影艺术系的学生也许就是这里艰难的生存吧。

 问题四:选星级适合所有的网站吗?

虽然对我有些困扰,但电影这样的网站,选用星级来评分貌似还是比较合理的方法。花了两个小时看电影,相信观众可以根据自己的感觉,直观的得到一个大概的分数级别。但这个方法能适合所有的评分体系吗?

相信这个问题是没有答案的。在分析第一个问题的时候,我还想象投票的用户是泾渭分明的,好电影所有人都会说好,不好的电影所有人都投一颗星。但实际上通过对多部电影评分数据的分析,在高分数电影上可以看到类似倾向,但一般电影中并没有类似的长尾效果。

Facebook采用“Yes/No”的选项,让用户做一个干净的解决方法。每个blog文章,一个图片,一条消息,一切的一切,只要你喜欢,就按一下啊这个按钮。

个人而言,我很赞赏这个方法。在很多领域,评论一个事物的好坏,其实来是分作很多方面的。有人赞赏一部电影趣味性的故事情节,有人喜欢摄像师美丽的画面,还有演员的表演是不是到位……,这一切也可以从多个角度评论一部电影,一本书,一张照片,一部笔记本电脑,一个手机。无疑,这种方式下的评论可扩展性将比现在星级的方式大大提高,用户得到的信息也更加有效。