Search code examples
azure-service-fabricunreal-engine4

Service Fabric can't connect to guest executable on UDP (Unreal Engine Server)


I'm trying to deploy Unreal Server guest executable to Service Fabric. I've been fallowing this blog post:

http://haishibai.blogspot.com/2017/03/setting-up-highly-available-minecraft.html

Except I'm not using containers and use Windows based service.

On local cluster everything works. I can connect from client to deployed server.

When trying to connect to remote server, I can't connect to it.

When looking at my service fabric managment page It seems like my server process is working (it have proper process id).

In my LoadBalancing service I have port forwarding on UDP/7777, though HealthProbes are on TCP (there is no option to select UDP, I don't know if that mnatter).

Here Is my ServiceManifest:

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="UnrealGuestPkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ServiceTypes>
    <!-- This is the name of your ServiceType. 
         The UseImplicitHost attribute indicates this is a guest executable service. -->
    <StatelessServiceType ServiceTypeName="UnrealGuestType" UseImplicitHost="true" />
  </ServiceTypes>

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.0.0">
    <!-- The SetupEntryPoint is an optional element used to specify a
         program to be executed before the service's code is launched. -->
    <!--
    <SetupEntryPoint>
      <ExeHost>
        <Program></Program>
      </ExeHost>
    </SetupEntryPoint>
    -->
    <EntryPoint>
      <ExeHost>
        <Program>ActionRPGGame\Binaries\Win64\ActionRPGGameServer.exe</Program>
        <Arguments>-log</Arguments>
        <WorkingFolder>CodeBase</WorkingFolder>
        <!-- Uncomment to log console output (both stdout and stderr) to one of the
             service's working directories. -->
        <!-- <ConsoleRedirection FileRetentionCount="5" FileMaxSizeInKb="2048"/> -->
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <!-- Config package is the contents of the Config directoy under PackageRoot that contains an 
       independently-updateable and versioned set of custom configuration settings for your service. -->
  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <!-- This endpoint is used by the communication listener to obtain the port on which to 
           listen. Please note that if your service is partitioned, this port is shared with 
           replicas of different partitions that are placed in your code. -->
      <Endpoint Name="UnrealGuestTypeEndpoint" Port="7777" Protocol="udp" />
    </Endpoints>
  </Resources>
</ServiceManifest>

Solution

  • 1.You seem to be missing the service endpoint configuration.

    <Resources>
      <Endpoints>
        <!-- This endpoint is used by the communication listener to obtain the port on which to 
             listen. Please note that if your service is partitioned, this port is shared with 
             replicas of different partitions that are placed in your code. -->
        <Endpoint Name="ServiceEndpoint" Port="7777" />
      </Endpoints>
    </Resources>
    
    1. UDP isn't supported for probes on the load balancer. So, expose a second service endpoint that uses tcp, just as a health endpoint.