I'm using a very simple architecture for one of my intranet enterprise applications.
Client:
- 1 agent running on each computer sending system config data (one time), reports (every 2 to 5 min) => size of the data flowing from client to server is a few hundred bytes and rarely touches a kB.
Server:
- 1 web application (front-end to manage clients, view reports)
- a web service to receive all incoming data (which it simply dumps in a table)
- a system service to read the dump every few seconds and execute relevant queries - inserts, updates on the actual tables used for reporting (this step could probably be compared to ETL)
With thousands of clients sending data concurrently to the server, the server simply dumps this incoming data in a temporary table (one insert for each client sending data). A system service running in the background keeps flushing this temporary table - in the sense - every 10 seconds, it reads the top 100 rows from the dump table, organizes this data into the relevant tables used for reporting and removes these 100 rows from the dump and so on.
So far I've run my app in a network of 2,000 computers and it seems to be working well. Now I need to scale this to support a network of 25,000 clients. I'm gonna run simulation tests with 25,000 requests per second and check if the architecture holds good.
The server is .NET based. ASP .NET web application - front-end, web service to dump data. .NET based system service to perform ETL. SQL Server 2005/2008 as the db server.
Hope to get some constructive criticism and guidance from the stackoverflow community so as to improve this architecture. Do you feel it's good enough the way it is to work with 25,000 clients using a single server? What do you think would be the component most likely to break down with increasing concurrent activity? Is it fundamentally flawed? All sorts of guidance welcome. Thanks.