首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是应该在社交网络应用程序中使用WebSockets,还是使用PHP/AJAX就足够了?

我是应该在社交网络应用程序中使用WebSockets,还是使用PHP/AJAX就足够了?
EN

Stack Overflow用户
提问于 2015-07-07 09:07:51
回答 1查看 1.7K关注 0票数 0

我想听听你对一个项目的看法。我开始的方式,慢慢地提出许多差距和问题,无论是现在或将来,他们将产生大问题。

该系统将有一个通知系统、朋友系统、消息系统(私有),以及一般这样的系统。所有这些我已经设置: jQuery,PHP,mysqli往返,以避免繁琐。我明白标题上说的话了。

如果所有这些都做了一个简单的PHP代码,并为3-4在线用户发布和获取方法将是惊人的!问题是,当我有几个用户时,我能做些什么来更好地利用服务器的资源?所以我开始寻找更多,并发现像这样的socket.io

我只想找个人告诉我谁知道什么是最好的选择。现在想想更新通知系统是如何工作的。jQuery与post和重复每3-5秒,但这是绝对不对的.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-09 16:48:39

如果您的目标是建立一个高度可伸缩的通知服务,那么可能不是.

这并不是严格的拒绝,因为除了速度之外,还有其他因素需要考虑,但是当谈到速度时,继续读下去。

WebSockets确实为用户提供了一个持续开放的双向连接,从本质上说,这种连接非常快。此外,客户端不需要请求新的信息;当任何一方认为适当发送时,都会发送该信息。

但是,就生成内容的成本而言,连接本身节省的时间是微不足道的。您要调用多少个数据库来检查新的通知?您生成了多少结构化数据来让客户端知道更改通知图标?您从磁盘或整个网络读取数据多少次?

在使用任何WebSocket服务器时,这些成本都不会消失;它只会使一种缓解技术变得更加明显:将用户的通知状态保存在内存中,并在通知发生更改时更新它,以防止对磁盘、数据库和服务器本地网络进行昂贵的访问。

已知的经过验证的技术可以减少快速变化的web内容的服务时间成本:

反向代理(清漆缓存)

位于端口80上,充当一个非常瘦的web服务器。如果请求的对象不在代理的内存缓存中,它会将请求发送到“真正的”web服务器。这对于服务很少更改的内容尤其有用,比如您的图像和脚本,并且边缘端包含的内容大部分保持不变,但有一些不能缓存的小元素.例如,在电子商务站点上,产品的描述、图像等都可能被缓存,但是显示用户购物车内容的HTML不能,因此是边缘端包含的理想候选。

这将大大减少系统上的负载,因为使用磁盘IO的请求要少得多,这是一个比内存IO更有限的资源。(硬盘无法在寻找猫jpeg的同时寻找数据库资源。)

内存中的-值存储 (Memcached)

在创建一个可伸缩的通知系统方面,这可能会给您带来最大的好处。

还有其他内存中的键值存储系统,但是这个系统支持PHP,不只是一次,而是两次!(在PHP核心开发的伟大传统中,他们没有修复一个坏的实现,而是决定不实际将系统标记为已废弃的版本,并抛出适当的警告等等,这将使人们停止使用损坏的系统。mysql_诉mysqli_,我看着你.)(使用memcached版本,而不是memcache。)

总之,这很简单:当您频繁地进行数据库、文件系统或网络调用时,将结果存储在Memcached中。当您通过网络更新记录、文件或推送数据,并且这些数据用于存储在Memcached中的结果时,更新Memcached。

然后,当您需要数据时,首先检查Memcached。如果不存在,那么就进行一次代价高昂的长时间的磁盘、数据库或跨网络旅行。

记住Memcached不是一个持久的数据存储..。也就是说,如果您重新启动服务器,Memcached将完全恢复为空。您仍然需要一个持久的数据存储,所以仍然使用您的数据库、文件和网络。而且,Memcached被专门设计为一个易失性存储,只提供访问最多和更新最迅速的数据。如果数据变旧,则可以将其擦除,以便为更新的数据腾出空间。毕竟,RAM是快速的,但它并不像磁盘空间那么便宜,所以这是一个很好的权衡。

此外,没有键值存储系统是关系数据库.建立关系数据库是有原因的。您不想在键值存储区周围编写自己的ACID保证包装器。不希望在键值存储上强制执行引用完整性。键值存储的一个奇特的名称是一个No-SQL数据库。记住这一点:您可能从Cassandra这样的领域获得横向可伸缩性,也可能从Memcached这样的领域获得惊人的速度,但是您没有得到SQL和RDBMS所经历的几十年的进化。

最后,最后:

不要混合语言

如果在实现了反向代理和内存缓存之后,您仍然希望实现一个WebSocket服务器,那么您将拥有更多的能力。只需记住您选择的服务器的含义。

如果您想将Socket.io与Node.js结合使用,请用Javascript编写整个应用程序。否则,选择用与系统其他部分相同的语言编写的WebSocket服务器。

1种语言解决方案的示例:

代码语言:javascript
复制
<?php // ~/projects/MySocialNetwork/core/users/myuser.php
class MyUser {
    public function getNotificationCount() {
        // Note: Don't got to the DB first, if we can help it.
        if ($notifications = $memcachedWrapper->getNotificationCount($this->userId) !== null) // 0 is false-ish. Explicitly check for no result.
            return $notifications;
        $userModel = new MyUserModel($this->userId);
        return $userModel->getNotificationCount();
    }
}
... 
<?php // ~/projects/WebSocketServerForMySocialNetwork/eventhandlers.php
function websocketTickCallback() {
    foreach ($connectedUsers as $user) {
        if ($user->getHasChangedNotifications()) {
            $notificationCount = $user->getNotificationCount();
            $contents = json_encode(array('Notification Count' => $notificationCount));
            $message = new WebsocketResponse($user, $contents);
            $message->send();
            $user->resetHasChangedNotifications();
        }
    }
}

如果我们使用socket.io,我们必须编写两次MyUser类,一次用PHP编写,一次用Javascript编写。谁想打赌这些类会以相同的方式在两种语言中实现相同的逻辑呢?如果两个开发人员正在处理这些类的不同实现怎么办?如果一个but被应用到PHP代码中,但是没有人记得Javascript呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31264299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档