Jeff Standen explains about "The Difference Between Piping and Polling"
Piping (a.k.a. Pushing)
With the piping method, e-mail is delivered to an application in real-time at the cost of server resources and redundant application overhead.
Pros:
It’s fast. E-mail is delivered to the helpdesk proactively and in real-time.
It’s modular. The relatively expensive operations required to convert a raw MIME e-mail message into plaintext with usable file attachments can be offloaded to a speedy, specialized application. In previous versions of Cerberus Helpdesk, e-mail processing was handled by a parser written in the “C” programming language.
Cons:
It doesn’t scale well. Each new message is processed concurrently, each costing the overhead of the application starting up, initializing resources, processing, and then shutting down between each handled message.
It can bounce/blackhole messages. Since mail is delivered in real-time, the mail server is generally looking for an immediate clear-cut success or failure response code from an application. That means if you’re upgrading, tweaking, rebooting, or otherwise taking your helpdesk offline for a few minutes, new mail is bouncing for later retry. That’s normal behavior. However, if your helpdesk is accessible but in a broken state (e.g. halfway through an upgrade, having database issues) then it’s possible for mail to be accepted but not processed.
Wednesday, September 10, 2008
The Difference Between Piping and Polling
at
2:19 PM
0
comments
Posted by
roni schuetz
Labels: links
Saturday, August 30, 2008
GetHashCode() have been changed
As its written in MSDN (http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx):
Remarks:
The behavior of GetHashCode is dependent on its implementation, which might change from one version of the common language run-time to another. A reason why this might happen is to improve the performance of GetHashCode.
In the following versions exactly this happens:
- 2.0.50727.3053
- 2.0.50727.1433
Let's say you like to do something for load-balancing based on the following code:
return Math.Abs((key.GetHashCode() % serverAmount));
it will return a different server node in case of shared cache. To handle this issue we have added 2 things, first of all is an alternative hashing algorithm and second we check the run-time between clients and server and inform clients about it in case this happens.
If you are using a version of shared cache which is below 2.0.3.276 you need to keep all your systems up-to-date with the same CLR version or you decide to use a different hashing algorithm for your system. Within our notifier program you can check this quite easily.
To use following options you will firstly need to register, the registration can be done during installation or afterwards within a new option within menu context of SharedCache.com Notify application.
- Check if all environments are using same CLR
- A Test to check if you able to use all Hashing Algorithms
- Get Informed if your environment is using same version of shared cache, this is mostly important to grant all communication options between clients and caching nodes on your servers.
for more information about hashing algorithms which are supported by shared cache visit my website: http://www.sharedcache.com/ - or go directly to http://www.sharedcache.com/cms/shared_cache_notify.aspx
at
7:16 PM
0
comments
Posted by
roni schuetz
Labels: .net, C#, cache, clr, SharedCache, SharedCache thought, surprised
Friday, August 29, 2008
LINQ to SQL Serialization
Use the Generics, Extension and Reflection features to implement a generic serialization class library for LINQ to SQL classes
http://www.west-wind.com/WebLog/posts/147218.aspx
http://sql.codeproject.com/KB/linq/linqsqlserialization.aspx
at
4:00 AM
0
comments
Posted by
roni schuetz
Labels: links
Tuesday, August 26, 2008
Build a Web Chat Application using ASP.Net 3.5, LINQ and AJAX (in C# 3.5)
Junnark Vicencio explains how to build a chat application within 2 hours.
Technologies Used: ASP.Net 3.5, AJAX, JavaScript, C# 3.5, LINQ-to-SQL, MS SQL Server 2000/2005
http://www.junnark.com/Articles/Build-a-Web-Chat-Application-Using-ASP-Net-LINQ-and-AJAX-CS.aspx
at
11:10 PM
0
comments
Posted by
roni schuetz
Thursday, August 14, 2008
Check if server is available before you make requests
I had to implement a fallback system in case one of my primary servers is not available anymore because of any reason. There were no option to access servers over a loadbalancer or something else then a direct routing to each server.
After some compassion's how much time I gone waste for each request between usage of sockets or HttpWebRequest / WebRequest I decided to work directly with Sockets.
The implementation I decided to go for were quite easy (remember: keep it simple as possible) and its fast like hell - 9ms I'm loosing each check if the server is available or not. We use 2 servers - so I have to remember that there is a total of 18ms I'm loosing each time we have a running cycle to analyse data. In general my tests gave showed me that 5 of the 9 ms are used for DNS.GetHostEntry(ServerName) - if you can use IP-Addresses then I suggest to do it that way. Check out one of my previous post about this DNS.GetHostEntry(ServerName) - IPAddress.Parse("127.0.0.1") vs. Dns.GetHostEntry("127.0.0.1")
With those ~20ms we can leave very good because a cycle needs right now something around 2.5min and it can be a max. of 15min. So how to solve this is the question, here the codesample from MSDN which I adapted and using to validate if my servers are online: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx
Formatted Code is available here: http://www.ronischuetz.com/code/CheckIfServerIsAvailable.htm
1: private static bool ConnectSocket(string server, int port)
2: {3: Stopwatch sp = new Stopwatch();
4: IPHostEntry hostEntry = null;
5: bool result = false;
6: sp.Start();7: // Get host related information.
8: hostEntry = Dns.GetHostEntry(server); 9: sp.Stop();10: Log.Info(string.Format("ConnectSocket->Dns.GetHostEntry({0}) needed: {1}ms ",server, sp.ElapsedMilliseconds));
11: sp.Reset(); 12: 13: // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
14: // an exception that occurs when the host IP Address is not compatible with the address family
15: // (typical in the IPv6 case).
16: foreach (IPAddress address in hostEntry.AddressList)
17: { 18: sp.Start();19: IPEndPoint ipe = new IPEndPoint(address, port);
20: Socket tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
21: tempSocket.ReceiveTimeout = 1000; 22: tempSocket.SendTimeout = 1000;23: // this is very important!!! Do not delete this.
24: tempSocket.NoDelay = true;
25: 26: try
27: { 28: tempSocket.Connect(ipe);29: #region Status Check
30: if (tempSocket.Connected)
31: {32: #region Connnected Section
33: result = true;
34: if (tempSocket != null)
35: {36: try
37: { 38: tempSocket.Shutdown(SocketShutdown.Both); 39: tempSocket.Close(); 40: }41: catch (Exception ex)
42: {43: // do nothing - only release resources and don't let the system fuck up
44: }45: finally
46: {47: tempSocket = null;
48: } 49: }50: #endregion Connnected Section
51: break;
52: }53: else
54: {55: continue;
56: }57: #endregion End Status Check
58: }59: catch (Exception ex)
60: {61: string title = string.Format("Could not connect to server:{0}:{1} - " + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace, server, port);
62: Log.Info(title); 63: Log.Fatal(title);64: result = false;
65: } 66: 67: sp.Stop();68: Log.Info(string.Format("ConnectSocket->hostEntry.AddressList({0}) needed: {1}ms to connect to server ", ipe.Address.ToString(), sp.ElapsedMilliseconds));
69: sp.Reset(); 70: }71: return result;
72: }
at
8:51 PM
0
comments
Posted by
roni schuetz
Labels: C#, Database, development, Helper Code, performance, Testing