Using Profiles in a Web Farm Scenario
In a Web farm scenario, each server provides a local profile cache. The value of the user's profile (UserObject profile) in a particular cache can become outdated if the profile was changed on a different server. In order for the server to recognize that the user's profile has changed, a last updated timestamp is set in both the user's profile (in the Profiles store) and in a cookie for the user, when the profile is created and updated (by using the UpdateUserProfile method).
When a user visits a server in the Web farm, the timestamp in the profile in the local cache is checked against the timestamp in the cookie (by using the GetCurrentUserProfile method). If they are not equal, the profile is retrieved from the Profiles store (by using the GetInfo method of the IADs interface), bypassing the local cache. If cookies are not enabled, the cache is always bypassed, because there is no reliable way of tracking the last updated time due to Back button, page refresh, and other issues.
The Profiling System caches the lookup of address profiles. Organization profile lookups, however, bypass the cache on an as-needed basis depending on the likelihood of the data in the profile changing.
Even with the timestamp solution, there are potential cache coherency issues with the profiles. For instance, if a user's profile, which is currently cached, is changed from the Business or Partner Desk on a different computer by a different user, the sites will not know that the cache is out of date. To mitigate this, the Solution Sites call the GetInfo method upon login. If this level of accuracy is not acceptable, the Solution Sites include the m_iGlobalProfileLookUpOption variable, declared in the file include\setupenv.asp, which when set always forces a GetInfo method call to retrieve the profile from the Profiles store.
The following function, EnsureUpToDateUserProfile from the Solution Sites, illustrates the core functionality of an implementation that addresses these issues. To view the full context of the code that addresses Web farm issues, review the code in the Solution Sites files login.asp and stdprofile_lib.asp.
Sub EnsureUpToDateUserProfile(ByRef rsUser) Dim sCookieTimeStamp, sCacheTimeStamp ' Since testing cookie support on every page that ' calls UpdateUserProfile is ' expensive, we assume cookie support unless we detect a ticket in URL. If m_iTicketLocation <> 1 Then sCookieTimeStamp = Request.Cookies("UserProfileTimeStamp") sCacheTimeStamp = CStr(rsUser.Fields("ProfileSystem.date_last_changed").Value) If (sCookieTimeStamp = "") Or (sCacheTimeStamp <> sCookieTimeStamp) Then Call GetProfileFromDB(rsUser) ' Set/update the cookie timestamp If rsUser Is Nothing Then ' Delete the cookie for a deleted profile. Response.Cookies("UserProfileTimeStamp").Expires=Now - 1 Else Response.Cookies("UserProfileTimeStamp") = rsUser.Fields("ProfileSystem.date_last_changed").Value End If End If Else ' Get the current user's profile from the database ' if cookies are not supported. Call GetProfileFromDB(rsUser) End If End Sub