TCP scalability improvements Reply

I’m excited to talk about new stuff we have added to our latest release, RTI Connext 5.2.0. In particular, I’ll talk about scalability improvements we added to the RTI TCP Transport Plugin.

Full Windows IOCP Support

RTI Connext can be used for a wide range of scenarios: from relatively small deployments with dozens of DomainParticipants communicating over a LAN, to WAN scenarios involving hundreds or even thousands of DomainParticipants. Our TCP transport provides a way to communicate over the WAN that is NAT-friendly and easy to configure. In WAN scenarios, the transport can be used in asymmetric mode. In this case, there is one DomainParticipant acting as a TCP server that receives connections from several other DomainParticipants acting as TCP clients. The server DomainParticipant does not need to know the addresses of the client DomainParticipants.

Something to consider when building a TCP server that handles hundreds or thousands of clients is socket management strategy, or socket monitoring strategy. This refers to how the system reacts to socket-generated I/O events.

While the strategy used by RTI Connext 5.0.0 TCP Transport Plugin (select() monitoring) had good scalability for servers running on Linux systems (up to 1,500 clients), we observed during experiments that scalability on Windows systems dropped to approximately 600 clients.

In order to solve this issue, RTI Connext 5.1.0 added partial support of MS Windows IOCP (I/O Completion Ports) socket monitoring strategy to the TCP Transport Plugin.

MS Windows IOCP provides an efficient threading model for processing multiple asynchronous I/O requests on a multiprocessor system. During our test on Windows systems running RTI TCP Transport Plugin, we observed an increase of the scalability from roughly 600 clients to 1500. However, RTI Connext 5.1.0 did not include Windows IOCP support for TLS over TCP.

I’m glad to announce that the latest release RTI Connext 5.2.0 includes full support of Windows IOCP socket monitoring strategy.

You can start using this feature by adding the following XML snippet to the TCP Transport Plugin configuration:

<participant_qos>
  <property>
    <value>
      <element>
        <name>{transport_prefix}.socket_monitoring_kind</name>
        <value>WINDOWS_IOCP</value>
      </element>
    </value>
  </property>
</participant_qos>
  • *Where {transport_prefix} is the name you assigned to the RTI TCP Transport Plugin (for example, dds.transport.TCPv4.tcp1).

External Load Balancer Support

Windows IOCP support is not the only new scalability improvement included in RTI Connext 5.2.0. Now I’ll talk about another addition that provides support for even more DomainParticipants acting as TCP clients.

When requiring high scalability using TCP, the TCP server becomes the bottleneck, and we need to take advantage of external load balancers. A load balancer is a software or hardware device that increases the capacity and/or reliability of a system by transparently distributing the workload among multiple servers. In particular, a TCP load balancer distributes connections from TCP clients among multiple TCP servers – in our scenario, DomainParticipants.

RTI Connext TCP Transport Plugin creates multiple connections when communicating two DDS DomainParticipants. These connections create a common state – a session – between the two DomainParticipants. In previous releases, the RTI TCP Transport Plugin was not friendly with externals load balancers. This was because a load balancer may have distributed the connections among multiple DomainParticipants , thus preventing communication.

diagram00

In order to support external load balancers, RTI Connext 5.2.0 includes a new session-id negotiation feature. When session-id negotiation is enabled (by using the negotiate_session_id property) the TCP Transport Plugin will perform an additional message exchange that allows load balancers to assign to the same DomainParticipant all the connections belonging to the same session:

diagram01

In order to enable the session-id negotiation, you can use the following XML snippet:

<participant_qos>
  <property>
    <value>
      <element>
        <name>{transport_prefix}.negotiate_session_id</name>
        <value>1</value>
      </element>
    </value>
  </property>
</participant_qos>
  • *Where {transport_prefix} is the name you assigned to the RTI TCP Transport Plugin (for example, dds.transport.TCPv4.tcp1).

This feature has been tested on a system using F5 Big-IP load balancer. However, it will work with other load balancers as long as:

  • They are able to modify the TCP data stream to include a unique identification of the node serving the first connection on a session.
  • They are able to assign connections to a server depending on the content of the TCP data stream.

I hope you find these new features useful and helpful in deploying highly scalable RTI Connext–based systems. To try it for yourself, download our free 30 day trial, today!

We love our new Launcher Reply

For the new RTI Connext DDS 5.2 release, we have re-implemented the RTI Launcher application. We love it! We love the new native OS look and feel, we love the new functionality, and we’re confident you’ll love it, too.

LauncherWindowsLauncherLinuxLauncherMacOS

Of course, the basic idea is the same: providing you with an easy way to quickly access all the RTI products. The UI design hasn’t changed much, so the transition should easy for existing users. As usual, there are three main panels with our tools, infrastructure services and utilities. Every tool has a context menu, which shows related docs and information:
LauncherContextMenu

You can also open a window to show the command-line help for the service/utility – and what’s more, you can now access the history of commands that you launched in the current session for that specific product:

LauncherCommandHistory

This may turn out handy for you at some point, because it reminds you of the exact parameters you used for the call. You can also copy the contents for later reference.

Apart from the usual tabs for our tools, services and utilities, we’ve incorporated a new tab for third-party products, as part of our pilot project for an RTI marketplace:

LauncherThirdPartyTabLauncherThirdPartyDownload

This tab contains products and tools from our partners. These products are usually not installed by default, but worry not! You can easily download and install them by clicking on the green download arrow (or if you right-click to show the context menu, you’ll find a menu item to do that as well).

Another cool thing about our tabs is that there is an optional new tab (you just have to enable it) where you can put your stuff that you want to keep handy. I have to confess, I use (and love) Eclipse for development, so why not add it to my Launcher?

LauncherEclipse

I can even add tool-tips and context menu entries!

LauncherEclipseTooltipLauncherEclipseContextMenu

Good stuff. Now I can launch Eclipse from Launcher. Launcher has never been this “launchy”… And all configured via XML!

We’ve also added a Help tab. This tab contains links for information and documentation about RTI and Connext DDS. Some links are web links (you’ll need an Internet connection to access them) and some are links to local PDF documentation.

LauncherHelp

Lastly, I wanted to mention the Installation tab and the RTI Package Installer. There you can select a license file to use for your Connext installation. You can peer through the license contents (in a visual way). Launcher will notify you when your license is invalid or expired. You can also see which Connext products and components you have installed.
LauncherInstallation

And speaking of installing new (and awesome!) RTI stuff, Launcher has an interface for the new RTI Package Installer application. So if I want to install the new RTI Queuing Service I would just open the RTI Package Installer dialog and click the “+” button next to the package file for that product. (To open the RTI Package Installer, click the icon on the Installation tab or the Utilities tab.)
LauncherPackageInstaller

Then just click install and Launcher will call the Package Installer tool for you with all the files specified in the dialog. The new component will then be installed. Some components are shown by Launcher in panels and they will be ready to use after the installation.
LauncherQueuingInstalled

We think the new Launcher is a great addition to Connext 5.2! Go try it! We’re sure you’ll love it as much as we do!

Code Generator: Experiment with New Features

codegen

In previous posts we explained how RTI’s new code generator saves you time with faster code generation. It’s now the default code generator in RTI Connext DDS 5.2.0, and it includes a number of other new features we think you will like.

Did you know that our new code generator is much better at detecting syntax errors?

For instance, the code generator will tell you if you forgot to define a type, showing better error messages. And this is just one example.

Do you want to generate only the type files and your project files without overwriting your publisher/subscriber files?

Try the autoGenFiles option.

Do you want even more control over which files you generate?

The new create and update <typefiles | examplefiles | makefiles> options are your solution.

Are you compiling dynamically?

Generate your project files using the shareLib option. It will link your application with RTI’s core dynamic libraries.

Do you want to share private IDLs without showing their actual content?

Try the new obfuscate option.

Are you using unbounded sequences?

Try the unboundedSupport option. Read this blog post to learn more about this new feature.

It’s all easier than ever with the Apache Velocity (VLT) templates. You can check the predefined set of variables available in RTI_rtiddsgen_template_variables.xlsx, located in the Code Generator documentation folder.

As a simple example, imagine you want to generate a new method that prints whether each member of a type is an array or a sequence. It could also print the corresponding dimensions or size. For example, consider this type:

module Mymodule{ 
    struct MyStruct{ 
       long longMember; 
       long arrayMember [2][100];
       sequence sequenceMember;
       sequence arrayOfSequenceMember[28];
    };
};

Our desired print function would be something like this:

void MyModule_MyStruct_specialPrint(){ 
    printf(" longMember \n");
    printf(" arrayMember is an array [2, 100] \n "); 
    printf(" sequenceMember is a sequence <2> \n"); 
    printf(" arrayOfSequenceMember is an array [28] is a sequence <5> "); 
}

Implementing this is straightforward. You would just need to create a few macros in the code generator templates to generate the above code. We start with the main method, which would be something like this:

void ${node.nativeFQName}_specialPrint(){

#specialPrint ($node)

}

This method calls to specialPrint macro. That macro iterates within the struct members and print whether they are an array or a sequence

#macro (specialPrint $node)

#*--*##foreach($member in $node.memberFieldMapList)

print("$member.name #isAnArray($member) #isASeq($member) \n");

#*--*##end

We just need to define  two auxiliary macros to check each case.

#macro (isAnArray $member)

#if($member.dimensionList) is an array $member.dimensionList #end

#end

#macro (isASeq $member)

#if($member.seqSize) is a sequence &lt;$member.seqSize&gt; #end

#end

If you need more information about supported and new features available in Code Generator, check out the Getting Started Guide or the online documentation.