I am running DNN 3.2.2 on multiple web servers pointed to single SQL database. I would say that DNN support for web farms is partially implemented and does have some issues.
The docs talk of three areas that need to be sensitive to web farm:
1. Caching. I have no problem with this function.
2. Scheduler. I believe this has serious troubles. I can find no code in scheduler process whatsoever that refers to the webfarm settings. So, the scheduler acutally runs the same regardless of webfarm settings. I am using the "server" settings for scheduler tasks so that specific Scheduler tasks run on a specific machine. That parts works. For example, I configured the module indexer to run on only one machine named "server". However, I am also configured for 2 separate websites in IIS on another machine (for SSL cert and other reasons) that point to same physical code directory.
What happens is that each Scheduler task process is run once for each IIS website. The same problem occurs if IIS webgardens are used (number of worker processes > 1). I believe what needs to happen is that the entire Scheduler code needs to split the work out by ThreadId. so, something like:
Look for a task due to be worked on NOW by server=me and thread=blank. If found, update task with threadid = my threadId. Look for task due to be worked on NOW and threadId = my threadId. If found, then "its my task" do the work. If not found, then another thread snatched the task.
That way, both webgardens and web farms would not end up with multiple parallel worker processes trying to do the same work, which tpyically results in database deadlocks, by the way.
Second problem. The entire schedule should work off UCT date time, not server time. And use the database time. So, have SQL insert or update tasks, history, etc with getdateutc() , not use .Net Nowuct() The reason this is a problem is that I have two web servers in different timezones pointed to same database, so one is always an hour behind and never "gets" to its tasks, they are always 1 hr plus away from "due", since the other server always grabs the task.
3. Logging. Similar timezone issues. With web servers in different time zones pointed to a single database, the event log entries (such as errors) get logged with intermixed times. I solved this by changing the stored procedue to insert a log entry to ignore the passed datetime value. I insert getdateutc() instead. That way, all log entries are recorded in "database server" time (there is only one database regardless of how many web servers your have) and they are all in UTC time. I then had to modify the eventinfo class (I thnk that was the object) to convert UTC to user time for display purposes.
So, it works OK as a webfarm. It really has troubles as a web garden since it thinks all worker process with same machine name are the same.