我在几个服务器上运行相同的后端应用程序,并且可以从它们请求数据的PHP前端。因此,当用户来并想要请求数据时,PHP必须从一个后端服务器请求它,然后进行一些计算和填充。
目前我选择后端服务器以这种方式请求数据:
$servers = array(
array('IP', 'PORT'),
array('IP', 'PORT'),
array('IP', 'PORT'),
array('IP', 'PORT'),
array('IP', 'PORT'),
array('IP', 'PORT'),
array('IP', 'PORT'),
array('IP', 'PORT')
);
$server = $servers[mt_rand(0,count($servers)-1)];
但现在这并没有完全旋转,它是相当随机的,不幸的条纹可能导致一个服务器过载而另一个服务器空转,我宁愿让它们正确旋转以便始终大致使用它们在相同的工作量。这样也可以更轻松地分析用户流并查看何时需要新的后端服务器。
在没有随机化的情况下旋转服务器的最佳性能是什么?我应该制作一个文本文件,然后调用它" rotation.txt"并简单地放入上次请求的$ servers索引,然后下一次($lastUsedIndex + 1) % count($servers)
?这将包括很多将文件写入磁盘的网站,该网站通常有数千个并发用户。制作MySQL表rotation
并插入最后使用的$ servers索引会更快吗?或者是否有一种我现在无法想到的完全不同的方式?
编辑:
PHP将以json的形式请求数据:$fp = @fsockopen($server[0], $server[1], $errstr, $errno, 5);
答案 0 :(得分:1)
我不愿意发布这个问题的答案,因为有很多可能的答案,所有这些答案都或多或少都有效。
但是,您是否考虑过要做的事情(保持使用旋转增量)但不是将其写入数据库或磁盘文件,而是将其存储在共享内存中?这应该非常快,并且可以跨进程访问。然后,您可以按进程依次命中每个服务器。
如果您的PHP没有使用任何形式的shared memory进行编译并且无法重新编译,那么请查看将“文件”写入/dev/shm
(无论如何在Linux上),这是一个基于内存的伪文件系统。
警告:
瓶颈可能就是内存段本身。如果您的请求相对较低且处理需要花费时间,(考虑到您的单个前端和多个后端可能是正确的),这可能是您的可能吗?
如果不使用memcache之类的内容,它将无法扩展到多个前端服务器。