For completeness, I should add that you can devise your own state to map CANCELs to upstream branches, and you can even distribute it using DMQ -- if you use htable. So, it's not as if there are no solutions.
— Sent from mobile, apologies for brevity and errors. > On Dec 16, 2022, at 10:31 AM, Alex Balashov <abalas...@evaristesys.com> wrote: > > Yes to all of that. :-) > > — > Sent from mobile, apologies for brevity and errors. > >> On Dec 16, 2022, at 10:25 AM, Jawaid Bazyar <baz...@gmail.com> wrote: >> >> Hi Alex, >> >> Thanks for your (as usual) thorough reply. >> >> So, if I understand correctly what you're saying, as an example: >> >> INVITE to 200 OK is one transaction >> >> BYE to OK is a different transaction. >> >> And there is nothing that would prevent successful operation if each of >> these transactions were handled by different proxies. >> >> >> In the CANCEL scenario you mention, if CANCELs are lost I presume eventually >> the other party will figure out something isn't right and terminate its >> branch from the other direction? >> >> Cheers, >> >> Jawaid >> >> >> >> On 12/14/22, 8:30 PM, "Alex Balashov" <abalas...@evaristesys.com> wrote: >> >> Hi, >> >> As a starter for your exploration, a few key points: >> >> (1) When we talk about stateful proxies, we (and the standards) mean that >> they are transaction-stateful, not something like "dialog-stateful". >> >> A transaction consists of a SIP request and 0 or more provisional replies >> (where applicable) and a final dispositive reply (2xx - 6xx), although ACK >> is a little special. >> >> This is what a stateful proxy has memory of, and, aside from conferring a >> slight performance benefit[1], it is needed to implement things like >> failover timers. Can't have a timeout if you aren't tracking something. >> >> (2) Neither transaction state, nor dialog state, nor any other kind of >> state, is required to route a SIP message, with the exception of a CANCEL >> (see below). >> >> Thus, this formulation is actually quite incorrect: "then use stateful >> responses to direct client back to same node for subsequent messages in a >> dialog." >> >> You do not need state to route in-dialog requests to the correct place, as >> these are routed via the Route/RR set in the SIP request body itself. You do >> not need state to route replies to the correct place, whether to in-dialog >> requests or any other kind of request, because this is done through the >> 'Via' header stack. >> >> So, everything that is needed to route SIP requests and replies within >> some sort of context that persists for some amount of time (SIP calls this a >> dialog) can actually be found in the content of SIP messages themselves. >> >> You can easily show this by using a stateful-only (i.e. TM) configuration >> and restarting Kamailio in the middle of a pending or established call. Try >> it and watch the capture. You will see that every message you expect to have >> delivered, whether request or reply, will make it exactly where you think it >> should, even though Kamailio has lost all transaction state[2]. >> >> A firm grasp of this is very important to any redundancy ruminations. >> >> (3) The exception to this is a CANCEL, and that is because a CANCEL is a >> so-called "hop-by-hop" request. >> >> Whereas most requests and replies pass through the proxy, the proxy is >> actually an independent party to CANCEL requests. That is to say, when a >> party CANCELs an INVITE, it actually asks the proxy to CANCEL it, and the >> proxy asks any upstream branches to CANCEL separately. This is to make the >> forking behaviour of proxies possible. >> >> The consequence of this is that when a proxy receives a CANCEL request, it >> needs transaction state in order to know which upstream branches to match it >> up to. If it is lost, it won't know what to do with the CANCEL. >> >> This is the primary obstacle to anycast setups, from my point of view. You >> can count on any proxy to relay requests statelessly in a correct fashion, >> but you can't count on any proxy to process a CANCEL correctly. So, if a >> CANCEL goes to a different place than the INVITE to which it corresponds, >> it'll be dropped on the floor. >> >> ... >> >> Otherwise, and notwithstanding transparent approaches like anycast, the >> methods you're contemplating are all variations of a common idea: the >> redundancy and failover is provided on the client side, in principle. Actual >> choice of method here is usually dictated by what the concrete clients in >> questio support. For example, not all clients support DNS-based failover, or >> may not implement it in the way you want. If you're offering a service to >> many different kinds of clients or devices, you'll have to take that into >> account. >> >> -- Alex >> >> [1] At a memory cost, but this isn't really a factor in modern computing. >> >> [2] Where it exists. An established call (200 OK + e2e ACK, no BYE yet) >> will actually not have any transaction state, since all transactions >> involved in establishing it have been terminated and no further >> transactions, e.g. to hang it up, have been created. >> >>>> On Dec 14, 2022, at 6:56 PM, Jawaid Bazyar <baz...@gmail.com> wrote: >>> >>> Hi, >>> I am exploring different redundancy / load-balancing models for a Kamailio >>> cluster. When I say cluster, I mean, a number (N) of Kamailio nodes acting >>> as stateful proxies. >>> Each node is configured the same as the others, and all have access to the >>> same lookup data to make routing decisions. >>> I would appreciate any advice or experience any of you can share on these >>> different models. >>> Overall model: >>> >>> • Direct to proxies >>> • Redirect servers first, which redirect to proxies >>> Selecting the first node to talk to. Each model could use either type of >>> selection. >>> >>> • DNS-based (SRV or NAPTR, client makes call to dns name) >>> • Anycast with ECMP (equal-cost multi-path routing) >>> • Cluster with a mobile IP and service-down detection (this would just >>> provide 1:1 protection) >>> Have clients make calls through the proxy using a DNS record containing an >>> SRV record for each node (or, alternatively, done with NAPTR). Would rely >>> on the client to switch nodes in the event of a node failure mid-call. (Is >>> that even possible?) >>> Anycast would only work with UDP signaling. Use Anycast to find the first >>> proxy, then use stateful responses to direct client back to same node for >>> subsequent messages in a dialog. >>> So for anyone who has tried any of these methods, I would love to hear the >>> pros and cons.. >>> Thanks in advance! >>> Jawaid >>> __________________________________________________________ >>> Kamailio - Users Mailing List - Non Commercial Discussions >>> To unsubscribe send an email to sr-users-le...@lists.kamailio.org >>> Important: keep the mailing list in the recipients, do not reply only to >>> the sender! >>> Edit mailing list options or unsubscribe: >> >> >> -- >> Alex Balashov | Principal | Evariste Systems LLC >> >> Tel: +1-706-510-6800 / +1-800-250-5920 (toll-free) >> Web: http://www.evaristesys.com/, http://www.csrpswitch.com/ >> >> __________________________________________________________ >> Kamailio - Users Mailing List - Non Commercial Discussions >> To unsubscribe send an email to sr-users-le...@lists.kamailio.org >> Important: keep the mailing list in the recipients, do not reply only to >> the sender! >> Edit mailing list options or unsubscribe: >> >> >> __________________________________________________________ >> Kamailio - Users Mailing List - Non Commercial Discussions >> To unsubscribe send an email to sr-users-le...@lists.kamailio.org >> Important: keep the mailing list in the recipients, do not reply only to the >> sender! >> Edit mailing list options or unsubscribe: __________________________________________________________ Kamailio - Users Mailing List - Non Commercial Discussions To unsubscribe send an email to sr-users-le...@lists.kamailio.org Important: keep the mailing list in the recipients, do not reply only to the sender! Edit mailing list options or unsubscribe: