7

我正在开发一个需要在 Internet 服务器上运行的程序(一个供多个跨平台程序使用的后端组件)。我熟悉要采取的安全预防措施(例如,防止缓冲区溢出和 SQL 注入攻击),但以前从未编写过服务器程序,或任何将在这种规模上使用的程序。

该程序需要能够同时为成百上千的客户提供服务。这些协议旨在提高处理速度并最大限度地减少必须交换的数据量,并且服务器端将用 C 语言编写。Windows 和 Linux 版本都将使用相同的代码。

问题:

  • 程序应该如何处理通信——多个线程,一个线程依次处理所有套接字,或者为每这么多传入连接(或每个连接)生成一个新进程?
  • 我是否需要担心诸如内存碎片之类的事情,因为这个程序一次需要运行几个月?
  • 对于此类编程,有哪些经验丰富的桌面和移动系统跨平台程序开发人员可能不知道其他设计问题?

请不要建议使用其他语言。那个决定已经做出了,因为我不能自由地说。

4

2 回答 2

4

因为我会使用libeventlibev和非阻塞 I/O。这样,操作系统将处理您的大多数调度问题。我还会使用线程池来处理任务,这些任务本质上是阻塞的,所以它们不会阻塞主循环。如果您需要从磁盘读取或写入大量数据,请再次使用 mmap,让操作系统尽可能多地处理。

基本建议是尽可能使用操作系统。如果您想要一个很好的程序示例,请查看Varnish,它编写得非常好,并且性能出色。

于 2013-04-15T08:57:55.777 回答
2

以我运行多台服务器超过 3 年的正常运行时间以及运行时间超过一年的程序的经验,我仍然可以建议进行设置,以便系统从程序错误和服务器重新启动中正常恢复。

即使重新启动程序时性能会受到影响,您也需要能够处理它,因为外部环境可能会强制程序重新启动。

不要在不需要时尝试重新发明轮子,并查看zeromq或类似的东西来处理传入通信的分配。(如果允许,使用比 C 语言(如 Python)更宽容的语言对后端进行原型设计,然后重新实现C但保留通信协议)

于 2013-04-15T09:02:24.877 回答