1 2 Previous Next 16 Replies Latest reply on Mar 28, 2014 5:14 AM by igor.dragic

    stateless ejb load balancing wildfly

    igor.dragic

      I have created simple web app with one Stateless bean HelloBean.

      <code>

      @Stateless

      @Remote(HelloRemote.class)

      public class HelloBean implements HelloRemote {

          @Override

          public String helloWorld() {

              try {

                  Thread.sleep(2000);

              } catch (InterruptedException ex) {

                  Logger.getLogger(CalculatorBean.class.getName()).log(Level.SEVERE, null, ex);

              }

              return ("Running EJB on JBoss bound to "

                      + System.getProperty("jboss.bind.address"));

          }

      }

      </code>

       

      In my web applicartion I also have servlet with following method:

       

      <code>

                  InitialContext ctx = new InitialContext();

                  HelloRemote remoteBean = (HelloRemote) ctx.lookup("java:jboss/exported/ejb-server-1.0-SNAPSHOT/HelloBean!com.wf.ejb.server.HelloRemote");

                  out.println("<!DOCTYPE html>");

                  out.println("<html>");

                  out.println("<head>");

                  out.println("<title>Servlet RemoteClient</title>");

                  out.println("</head>");

                  out.println("<body>");

                  for (int i = 0; i < 10; i++) {

                      out.println("<h1>Servlet RemoteClient at " + remoteBean.helloWorld() + "</h1>");

                      System.out.println(remoteBean.helloWorld());

                  }

                  out.println("</body>");

                  out.println("</html>");

      </code>

       

      I am trying to run this app to wildfly cluster but application is only executed on one node (cluster has two nodes). Any idea what's wrong?

      P.S.

      I have tried session replication example on same cluster and it works just fine.

        • 1. Re: stateless ejb load balancing wildfly
          wdfink

          The ejb invocation is prefered on the local node to prevent from unnecessary costs (i.e. serialization, network ...)

          If you have a web app which is not loadbalanced with a LB in front you might separate it and run the web-app unclustered and try to invoke the EJB's installed at a backend cluster.

           

          But from my experiance I would cluster the web-app directly

          • 2. Re: stateless ejb load balancing wildfly
            pferraro
            1 of 1 people found this helpful
            • 3. Re: stateless ejb load balancing wildfly
              igor.dragic

              Thank for the reply.

              My idea is to build application which would have LB in front but also I want to distribute ejb calls through cluster. I have some methods that can be break into couple of calls to the database(read only) to get speed.

              Is this a bad idea? Does wildfly always make call to local ejb and in which case call is distributed?

              • 4. Re: stateless ejb load balancing wildfly
                pferraro

                Wouldn't you be better off deploying your web application and EJBs to all nodes in the cluster and using local SLSB invocations?  Since your load is already being distributed by the load balancer, I don't see much benefit from the additional distribution of your SLSB invocations.  You'd be better off avoid unnecessary remote invocations.

                • 5. Re: stateless ejb load balancing wildfly
                  igor.dragic

                  Paul Ferraro wrote:

                   

                  See: https://docs.jboss.org/author/display/WFLY8/EJB+invocations+from+a+remote+server+instance

                  Thank you for the link. It works as described. But I have question about cluster. I want to expand this example and to call same ejb deployed in cluster environment. What address should I specify into standalone-full.xml. My cluster has two instances: 10.8.10.204 and 10.8.10.205.

                  If I specify 10.8.10.204 in standalone-full.xml I am getting error:

                  <code>

                  [org.jboss.ejb.client.remoting.RemotingConnectionClusterNodeManager] (default task-4) Could not create a connection for cluster node ClusterNode{clusterName='ejb', nodeName='slave:server-three-slave', clientMappings=[ClientMapping{sourceNetworkAddress=/0:0:0:0:0:0:0:0, sourceNetworkMaskBits=0, destinationAddress='10.8.10.205', destinationPort=8330}], resolvedDestination=[Destination address=10.8.10.205, destination port=8330]} in cluster ejb: java.lang.RuntimeException: Operation failed with status WAITING 

                  </code>

                   

                  If I shutdown instance on 10.8.10.205 it works.

                  P.S.

                  I have changed client servlet where I have add for loop:

                  <code>

                  for (int i = 0; i < 10; i++) {

                       System.out.println(bean.greet());

                  }

                  </code>

                  • 6. Re: stateless ejb load balancing wildfly
                    pferraro

                    If I specify 10.8.10.204 in standalone-full.xml I am getting error:

                    What do you mean by "specify 10.8.10.204 in standalone-full.xml"?  Where are you defining the address?

                    • 7. Re: stateless ejb load balancing wildfly
                      igor.dragic

                      I have solved that issue. I specified this:

                       

                      <code>

                      <outbound-socket-binding name="remote-ejb1">

                                      <remote-destination host="10.8.10.204" port="8230"/>

                                  </outbound-socket-binding>

                                  <outbound-socket-binding name="remote-ejb2">

                                      <remote-destination host="10.8.10.205" port="8230"/>

                                  </outbound-socket-binding>

                      </code>

                      in standalone-full.xml and that work as expected. Even load balancing works well. I'm now trying to deploy client application at the same cluster where ejb is deployed but I was wondering where to put above xml snippet to make this to work?

                      Is this possible?

                      Thanks.

                      • 8. Re: stateless ejb load balancing wildfly
                        pferraro

                        The node on which your client application will be deployed needs to define a remote-outbound-connection and corresponding outbound-socket-binding in its standalone-full.xml.

                        • 9. Re: stateless ejb load balancing wildfly
                          igor.dragic

                          My cluster is configured in domain mode following this url https://docs.jboss.org/author/display/WFLY8/WildFly+8+Cluster+Howto.

                          Do I need to put remote-outbound-connection and corresponding outbound-socket-binding in standalone-full.xml because config files for this mode are domain.xml and host.xml?

                          • 10. Re: stateless ejb load balancing wildfly
                            wdfink

                            You might have a look to the ejb-multi-server quickstart.

                            The configuration is in the appropriate profile of domain.xml

                            • 11. Re: stateless ejb load balancing wildfly
                              pferraro

                              Oh - I didn't realize you were using the domain controller.  outbound-socket-bindings per <server/> would go in host.xml, within the <servers/> section.

                              • 12. Re: stateless ejb load balancing wildfly
                                wdfink

                                I thought it was configured per profile in domain.xml, host.xml/server can only set a different socket-binding-group or a specific offset.

                                Or am I wrong?

                                • 13. Re: stateless ejb load balancing wildfly
                                  pferraro

                                  Sorry - I misspoke.  In host.xml, you'd specify the socket-binding-group to use for that server, the definition of which contains the the outbound-socket-binding.

                                  • 14. Re: stateless ejb load balancing wildfly
                                    igor.dragic

                                    Thank both of you for replies. I have make some progress but now i'm facing a strange issue.

                                    I have created two server groups - one for server app and one for client app. My goal is to deploy and client and server app to cluster.

                                    Deployment of server app is done without problems. Deployment of client apps causing this error:

                                     

                                    On master node:

                                    <code>

                                    [Server:web-client] 13:30:01,190 INFO  [org.jboss.ejb.client.remoting] (default task-5) EJBCLIENT000017: Received server version 2 and marshalling strategies [river]

                                    [Server:web-client] 13:30:01,199 INFO  [org.jboss.ejb.client.remoting] (MSC service thread 1-1) EJBCLIENT000013: Successful version handshake completed for receiver context EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@66321800, receiver=Remoting connection EJB receiver [connection=Remoting connection <4f4f0770>,channel=jboss.ejb,nodename=slave:web-server-slave]} on channel Channel ID 987816ab (outbound) of Remoting connection 5303f245 to test/10.8.10.205:8380

                                    [Server:web-client] 13:30:01,982 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) JBAS017534: Registered web context: /client-app-web

                                    [Server:web-client] 13:30:02,219 INFO  [org.jboss.as.server] (host-controller-connection-threads - 1) JBAS018559: Deployed "client-app-ear-1.0-SNAPSHOT.ear" (runtime-name : "client-app-ear-1.0-SNAPSHOT.ear")

                                    [Server:web-client] 13:30:06,301 INFO  [org.jboss.ejb.client.remoting.RemotingConnectionClusterNodeManager] (ejb-client-cluster-node-connection-creation-4-thread-2) Could not create a connection for cluster node ClusterNode{clusterName='ejb', nodeName='master:web-server', clientMappings=[ClientMapping{sourceNetworkAddress=/0:0:0:0:0:0:0:0, sourceNetworkMaskBits=0, destinationAddress='10.8.10.204', destinationPort=8380}], resolvedDestination=[Destination address=10.8.10.204, destination port=8380]} in cluster ejb: java.lang.RuntimeException: Operation failed with status WAITING

                                    [Server:web-client] at org.jboss.ejb.client.remoting.IoFutureHelper.get(IoFutureHelper.java:94) [jboss-ejb-client-2.0.0.Final.jar:2.0.0.Final]

                                    [Server:web-client] at org.jboss.ejb.client.remoting.ConnectionPool.getConnection(ConnectionPool.java:77) [jboss-ejb-client-2.0.0.Final.jar:2.0.0.Final]

                                    [Server:web-client] at org.jboss.ejb.client.remoting.RemotingConnectionManager.getConnection(RemotingConnectionManager.java:51) [jboss-ejb-client-2.0.0.Final.jar:2.0.0.Final]

                                    [Server:web-client] at org.jboss.ejb.client.remoting.RemotingConnectionClusterNodeManager.getEJBReceiver(RemotingConnectionClusterNodeManager.java:79) [jboss-ejb-client-2.0.0.Final.jar:2.0.0.Final]

                                    [Server:web-client] at org.jboss.ejb.client.ClusterContext$EJBReceiverAssociationTask.call(ClusterContext.java:405) [jboss-ejb-client-2.0.0.Final.jar:2.0.0.Final]

                                    [Server:web-client] at org.jboss.ejb.client.ClusterContext$EJBReceiverAssociationTask.call(ClusterContext.java:379) [jboss-ejb-client-2.0.0.Final.jar:2.0.0.Final]

                                    [Server:web-client] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [rt.jar:1.7.0_40]

                                    [Server:web-client] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_40]

                                    [Server:web-client] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_40]

                                    [Server:web-client] at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_40]

                                    [Server:web-client]

                                    </code>

                                     

                                    Same error is on the slave node except that address is 10.8.10.205. It's like client can not make connection to server on the same host.

                                    When I run application with http://10.8.10.204:8580/client-app-web/Test all ejb calls are executed on 10.8.10.205 (slave). When I run application with http://10.8.10.205:8580/client-app-web/Test all ejbs are executed on 10.8.10.204.

                                     

                                    My config in host.xml on 10.8.10.204 is:

                                    <code>

                                    <servers>

                                            <server name="web-client" group="client-web-app" auto-start="true">

                                                <socket-bindings port-offset="500"/>

                                            </server>

                                            <server name="web-server" group="server-web-app" auto-start="true">

                                                <socket-bindings port-offset="300"/>

                                           </server>

                                    </code>

                                    Config in host.xml on 10.8.10.205 is:

                                    <code>

                                    <servers>

                                            <server name="web-server-slave" group="server-web-app" auto-start="true">

                                                <socket-bindings port-offset="300"/>

                                            </server>

                                             <server name="web-client" group="client-web-app" auto-start="true">

                                                <socket-bindings port-offset="500"/>

                                           </server>

                                    </servers>

                                    </code>

                                     

                                    Relevant part of domain.xml on both machines is:

                                    <code>

                                    <subsystem xmlns="urn:jboss:domain:remoting:2.0">

                                                    <endpoint worker="default"/>

                                                    <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/>

                                                     <outbound-connections>

                                                        <remote-outbound-connection name="remote-connection-war-ejb-1" outbound-socket-binding-ref="remote-war-1" username="ejb" security-realm="ejb-security-realm-1" protocol="http-remoting">

                                                            <properties>

                                                                <property name="SASL_POLICY_NOANONYMOUS" value="false"/>

                                                                <property name="SSL_ENABLED" value="false"/>

                                                            </properties>

                                                        </remote-outbound-connection>

                                                        <remote-outbound-connection name="remote-connection-war-ejb-2" outbound-socket-binding-ref="remote-war-2" username="ejb" security-realm="ejb-security-realm-2" protocol="http-remoting">

                                                            <properties>

                                                                <property name="SASL_POLICY_NOANONYMOUS" value="false"/>

                                                                <property name="SSL_ENABLED" value="false"/>

                                                            </properties>

                                                        </remote-outbound-connection>

                                                    </outbound-connections>

                                               </subsystem>

                                    </code>

                                     

                                    <code>

                                    <server-groups>

                                             <server-group name="server-web-app" profile="ha">

                                                <jvm name="default">

                                                    <heap size="64m" max-size="512m"/>

                                                </jvm>

                                                <socket-binding-group ref="ha-sockets"/>

                                            </server-group>

                                            <server-group name="client-web-app" profile="default">

                                                 <jvm name="default">

                                                    <heap size="64m" max-size="512m"/>

                                                </jvm>

                                                <socket-binding-group ref="standard-sockets"/>

                                           </server-group>

                                        </server-groups>

                                    </code>

                                     

                                    and this

                                    <code>

                                    <socket-binding-group name="standard-sockets" default-interface="public">

                                                <!-- Needed for server groups using the 'default' profile  -->

                                                <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>

                                                <socket-binding name="http" port="${jboss.http.port:8080}"/>

                                                <socket-binding name="https" port="${jboss.https.port:8443}"/>

                                                <socket-binding name="txn-recovery-environment" port="4712"/>

                                                <socket-binding name="txn-status-manager" port="4713"/>

                                                 <outbound-socket-binding name="mail-smtp">

                                                   <remote-destination host="localhost" port="25"/>

                                                 </outbound-socket-binding>

                                                   <outbound-socket-binding name="remote-war-1">

                                                    <remote-destination host="10.8.10.204" port="8380"/>

                                                </outbound-socket-binding>

                                                <outbound-socket-binding name="remote-war-2">

                                                    <remote-destination host="10.8.10.205" port="8380"/>

                                                </outbound-socket-binding>

                                            </socket-binding-group>

                                    </code>

                                     

                                    Ping and telnet works as expected. Any ideas?

                                    Thanks.

                                    1 2 Previous Next