
在Windows平台下实现高并发网站,主要有以下几种技术方案:
cpp
#include <winsock2.h>
#include <mswsock.h>
class IOCPServer {
private:
HANDLE iocp_port;
std::vector<std::thread> workers;
public:
void start() {
// 创建IOCP句柄
iocp_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
// 创建工作线程
for(int i = 0; i < std::thread::hardware_concurrency(); ++i) {
workers.emplace_back([this] { worker_thread(); });
}
// 接受连接并关联到IOCP
SOCKET listen_socket = create_listen_socket();
while(true) {
SOCKET client_socket = accept(listen_socket, NULL, NULL);
CreateIoCompletionPort((HANDLE)client_socket, iocp_port, (ULONG_PTR)client_socket, 0);
// 投递异步接收操作
post_async_recv(client_socket);
}
}
private:
void worker_thread() {
while(true) {
DWORD bytes_transferred;
ULONG_PTR completion_key;
OVERLAPPED* overlapped;
BOOL result = GetQueuedCompletionStatus(
iocp_port, &bytes_transferred, &completion_key, &overlapped, INFINITE);
if(result) {
// 处理完成的I/O操作
process_completion(completion_key, bytes_transferred, overlapped);
}
}
}
};cpp
#include <http.h>
#pragma comment(lib, "httpapi.lib")
class HttpSysServer {
public:
void start() {
HTTPAPI_VERSION version = HTTPAPI_VERSION_2;
HttpInitialize(version, HTTP_INITIALIZE_SERVER, NULL);
// 创建URL组和请求队列
HTTP_SERVER_SESSION_ID server_session;
HttpCreateServerSession(version, &server_session, 0);
HTTP_URL_GROUP_ID url_group;
HttpCreateUrlGroup(server_session, &url_group, 0);
// 添加URL
HttpAddUrlToUrlGroup(url_group, L"http://localhost:80/", 0, 0);
// 创建请求队列
HANDLE request_queue;
HttpCreateRequestQueue(version, L"MyApp", NULL, 0, &request_queue);
// 开始处理请求
process_requests(request_queue);
}
private:
void process_requests(HANDLE request_queue) {
while(true) {
HTTP_REQUEST_ID request_id;
DWORD bytes_read;
PHTTP_REQUEST request = get_http_request(request_queue, &request_id, &bytes_read);
// 处理请求并发送响应
HTTP_RESPONSE response = {0};
response.StatusCode = 200;
HttpSendHttpResponse(request_queue, request_id, 0, &response, NULL, NULL, NULL, NULL, NULL, NULL);
}
}
};csharp
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseKestrel(options =>
{
// 配置Kestrel服务器
options.Listen(IPAddress.Any, 5000, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
});
})
.UseStartup<Startup>();
});
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}csharp
// Program.cs
webBuilder.UseKestrel(options =>
{
options.Limits.MaxConcurrentConnections = 10000;
options.Limits.MaxConcurrentUpgradedConnections = 10000;
options.Limits.MaxRequestBodySize = 28_000_000; // 28MB
options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});cpp
#include <boost/asio.hpp>
#include <boost/asio/use_awaitable.hpp>
#include <boost/asio/co_spawn.hpp>
using boost::asio::ip::tcp;
namespace this_coro = boost::asio::this_coro;
boost::asio::awaitable<void> handle_session(tcp::socket socket)
{
try {
std::vector<char> data(1024);
for (;;) {
std::size_t n = co_await socket.async_read_some(
boost::asio::buffer(data), boost::asio::use_awaitable);
// 处理请求
co_await socket.async_write_some(
boost::asio::buffer("HTTP/1.1 200 OK
Hello World"),
boost::asio::use_awaitable);
}
}
catch (std::exception& e) {
// 处理异常
}
}
boost::asio::awaitable<void> listener()
{
auto executor = co_await this_coro::executor;
tcp::acceptor acceptor(executor, {tcp::v4(), 8080});
for (;;) {
tcp::socket socket = co_await acceptor.async_accept(boost::asio::use_awaitable);
boost::asio::co_spawn(executor, handle_session(std::move(socket)), boost::asio::detached);
}
}cpp
#include <drogon/drogon.h>
int main()
{
drogon::app()
.setLogLevel(trantor::Logger::kWarn)
.addListener("0.0.0.0", 8080)
.setThreadNum(16) // 设置IO线程数
.setMaxConnectionNum(10000) // 最大连接数
.run();
return 0;
}cpp
void set_thread_affinity() {
DWORD_PTR affinity_mask = 1; // 第一个CPU核心
SetThreadAffinityMask(GetCurrentThread(), affinity_mask);
// 或者使用自动负载均衡
SYSTEM_INFO sys_info;
GetSystemInfo(&sys_info);
SetProcessAffinityMask(GetCurrentProcess(),
(1 << sys_info.dwNumberOfProcessors) - 1);
}cpp
#include <memoryapi.h>
class WindowsMemoryPool {
private:
HANDLE heap;
public:
WindowsMemoryPool() {
heap = HeapCreate(0, 0, 0); // 创建私有堆
}
void* allocate(size_t size) {
return HeapAlloc(heap, 0, size);
}
void deallocate(void* ptr) {
HeapFree(heap, 0, ptr);
}
};batch
# 调整TCP参数
netsh int tcp set global autotuninglevel=normal
netsh int tcp set global rss=enabled
netsh int tcp set global chimney=automatictext
客户端 → 负载均衡器 (Nginx/HAProxy)
→ 多个应用服务器实例
→ 数据库/缓存集群技术方案 | 并发能力 | 开发复杂度 | 适用场景 |
IOCP | |||
10万+ | 高 | 游戏服务器、实时通信 | |
HTTP.sys | 5万+ | 中 | 企业内部系统、API网关 |
ASP.NET Core | 2万+ | 低 | Web应用、微服务 |
Boost.Asio | 5万+ | 中高 | 跨平台高性能应用 |
根据具体业务需求、团队技术栈和性能要求选择合适的方案。对于大多数Web应用场景,ASP.NET Core已经能够提供足够好的性能,且开发效率最高。