The Case for Socket IO for mobile

Interactions

Author: Pronab Pal, Technical Architect, TCS

About me

  • Longtime java developer[2001+] in Sydney  /Canberra major Banks,IBM,Medicare, IPA ,Western union etc.pre-Java experience includes Nokia Game platform development.
  • promoter of use-case based development (Australian Innovation Patent)
  • ESB,Webservice specialisation for last 7 years
  • developing platform for mobile back end data interactivity  and context management :
  • Github: [Quadroo Server]
  • https://github.com/TheCuesFlowsToStoryProject/CuesFlow

Personal Mobile Phones as Multichanneler 

for Devices

with notification + intelligent machine 2 machine conversation

Devices & Mobile

  • Devices like google glass/apple watch, Beacons are coming standard part of interaction..Virgin has embraced it fully
  • Device triggers asychronous process in mobile that may call for server coordination e.g sending location specific instructions to passenger going through departure lounge.
  • asynchronous sockets interaction allows this to happen smoothly without tying up UI . 
  • Server also should be able to feed data in small context dependent chunks 

Reason For Device Flooding

  •  Mobiles carry lots of intelligent parts [accelerometer,gyrometer, magnetometer, blutooth adapters]
  •  Mass manufacturing Mobile made them cheap
  • TCP Communication stack is well established [pre web]
  • aurdino/raspberry pie like microplatforms easily accessible to devices
  • Younger generation/enterpreneurs get them easily

  What is Disruptive With Devices? Why we need a Fresh approach

  • context infestation from user ; sockets heardly used.
  • sockets provide multichannel duplex absent with HTTP
  • small converstaion -new information in extended context
  • demand for constant update [micro services]
  • Rest based interaction can not define microservices
  • XML or JSON does not provide context carry over 
  • Rest by design is  not asynchronous apps model

    Mobile Development Today

 !Continuous improvement in  the UI layer matching GPU units [e.g maturity with material design, lollipop,recognition of physics in human space] 

x Service invocation  spills in easily to the UI thread. [lack of data model]

x No general use of  tcp sockets -still unnecessary  http dependency [http was a web legacy]

x Age old problem of spaggeti-ness.

Carry over web issues: x sessions continuity, lack of immediate data source to reconnect after a drop out.

x bad sync issues with native and web components with work arounds. x missing strategy  for  web componenets & native componenets coexistance X vagueness with microservice -what it can be ?

Demo :NodeJava  Tunnel

Fast & Simple

Interaction:

Reasons 4 change

multiple Http Connection establishment costly

2-Way communication , makes notification easy

Bring contextual data in small chunks,readily updatable.

Gives oppertunity to trickle transition to new tech, cleaner codebase

Gives platform to go with  "micro services".

Comparison 2 old

socket overhead : in reality no more than http as it remains in its own thread.

New infrastructure : a Quadroo server sitting between apache webserver and mobiles  -instead of oracle application server

Akamai is not able to break content in small chunks [micro service]

 

Solution Components

  • UCL : uniform context locator for complexity management  & understandaibility, a jason structure with dictionary of contexts.
  • Node.js : interactivity through evented async process driver .
  • Context creation and Content access are two async processes, each having user interaction
  • Sockets : event driven 2-Way interaction .
  • Java : strong development model in small chunks [verbs]

UCL's

  • Put simply  json or XML with  dictionary
  • Removes variety in spelling,
  • predefined domain contexts e.g pnr/segment/seatno/breakfast
  • enables small chunks of contextual data

Traditional PNR (xml) 800 lines

 

UCL PNR

pnr{3H4NLL}

pnr.segment {3H4NLL,DelBom}

pnr.segment.flightno

{3H4NLL,DelBom,QF22}

pnr.segment.seatno{3H4NLL,DelBom,E45}

pnr.segment.seatno.breakfast{3H4NLL,DelBom,E45,{egg ,toast,coffee,}}

Text

FFPNRREC>
<PNR_Reply>
<pnrHeader>
<reservationInfo>
<reservation>
<companyId>1A</companyId>
<controlNumber>3H4NLL</controlNumber>
<date>311014</date>
<time>0014</time>
</reservation>
</reservationInfo>
</pnrHeader>
<pnrHeader>
<reservationInfo>
<reservation>
<companyId>1A</companyId>
<controlNumber>75IS9U</controlNumber>
<controlType>F</controlType>
</reservation>
</reservationInfo>
<referenceForRecordLocator>
<reference>
<qualifier>ST</qualifier>
<number>2</number>
</reference>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</referenceForRecordLocator>
</pnrHeader>
<securityInformation>
<responsibilityInformation>
<typeOfPnrElement>RP</typeOfPnrElement>
<agentId>DISU</agentId>
<officeId>SYDQF0115</officeId>
<iataCode>02398631</iataCode>
</responsibilityInformation>
<queueingInformation>
<queueingOfficeId>SYDQF0115</queueingOfficeId>
</queueingInformation>
<cityCode>MEL</cityCode>
<secondRpInformation>
<creationOfficeId>SYDQF0115</creationOfficeId>
<agentSignature>0001AA</agentSignature>
<creationDate>311014</creationDate>
<creatorIataCode>02398631</creatorIataCode>
<creationTime>0014</creationTime>
</secondRpInformation>
</securityInformation>
<freetextData>
<freetextDetail>
<subjectQualifier>3</subjectQualifier>
<type>P12</type>
</freetextDetail>
<longFreetext>--- AXR RLR RLP ---</longFreetext>
</freetextData>
<pnrHeaderTag>
<statusInformation>
<indicator>AXR</indicator>
</statusInformation>
<statusInformation>
<indicator>RLR</indicator>
</statusInformation>
<statusInformation>
<indicator>RLP</indicator>
</statusInformation>
</pnrHeaderTag>
<sbrPOSDetails>
<sbrUserIdentificationOwn>
<originIdentification>
<originatorId>02398631</originatorId>
<inHouseIdentification1>SYDQF0115</inHouseIdentification1>
</originIdentification>
<originatorTypeCode>A</originatorTypeCode>
</sbrUserIdentificationOwn>
<sbrSystemDetails>
<deliveringSystem>
<companyId>QF</companyId>
<locationId>SYD</locationId>
</deliveringSystem>
</sbrSystemDetails>
<sbrPreferences>
<userPreferences>
<codedCountry>AU</codedCountry>
</userPreferences>
</sbrPreferences>
</sbrPOSDetails>
<sbrCreationPosDetails>
<sbrUserIdentificationOwn>
<originIdentification>
<originatorId>02398631</originatorId>
<inHouseIdentification1>SYDQF0115</inHouseIdentification1>
</originIdentification>
<originatorTypeCode>A</originatorTypeCode>
</sbrUserIdentificationOwn>
<sbrSystemDetails>
<deliveringSystem>
<companyId>QF</companyId>
<locationId>SYD</locationId>
</deliveringSystem>
</sbrSystemDetails>
<sbrPreferences>
<userPreferences>
<codedCountry>AU</codedCountry>
</userPreferences>
</sbrPreferences>
</sbrCreationPosDetails>
<sbrUpdatorPosDetails>
<sbrUserIdentificationOwn>
<originIdentification>
<originatorId>02394372</originatorId>
<inHouseIdentification1>SYDQF0305</inHouseIdentification1>
</originIdentification>
<originatorTypeCode>A</originatorTypeCode>
</sbrUserIdentificationOwn>
<sbrSystemDetails>
<deliveringSystem>
<companyId>QF</companyId>
<locationId>SYD</locationId>
</deliveringSystem>
</sbrSystemDetails>
<sbrPreferences>
<userPreferences>
<codedCountry>AU</codedCountry>
</userPreferences>
</sbrPreferences>
</sbrUpdatorPosDetails>
<technicalData>
<enveloppeNumberData>
<sequenceDetails>
<number>2</number>
</sequenceDetails>
</enveloppeNumberData>
<lastTransmittedEnvelopeNumber>
<currentRecord>1</currentRecord>
</lastTransmittedEnvelopeNumber>
<purgeDateData>
<dateTime>
<year>2015</year>
<month>2</month>
<day>12</day>
</dateTime>
</purgeDateData>
</technicalData>
<travellerInfo>
<elementManagementPassenger>
<segmentName>NG</segmentName>
<lineNumber>0</lineNumber>
</elementManagementPassenger>
<passengerData>
<travellerInformation>
<traveller>
<surname>TESTQANTAS</surname>
<qualifier>G</qualifier>
<quantity>1</quantity>
</traveller>
</travellerInformation>
<groupCounters>
<quantityDetails>
<numberOfUnit>1</numberOfUnit>
<unitQualifier>BKD</unitQualifier>
</quantityDetails>
<quantityDetails>
<numberOfUnit>0</numberOfUnit>
<unitQualifier>CNL</unitQualifier>
</quantityDetails>
<quantityDetails>
<numberOfUnit>0</numberOfUnit>
<unitQualifier>SPL</unitQualifier>
</quantityDetails>
</groupCounters>
</passengerData>
</travellerInfo>
<travellerInfo>
<elementManagementPassenger>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
<segmentName>NM</segmentName>
<lineNumber>1</lineNumber>
</elementManagementPassenger>
<passengerData>
<travellerInformation>
<traveller>
<surname>DI SISTO</surname>
<quantity>1</quantity>
</traveller>
<passenger>
<firstName>CHRISTIAN R MR</firstName>
</passenger>
</travellerInformation>
</passengerData>
</travellerInfo>
<originDestinationDetails>
<originDestination/>
<itineraryInfo>
<elementManagementItinerary>
<reference>
<qualifier>ST</qualifier>
<number>2</number>
</reference>
<segmentName>AIR</segmentName>
<lineNumber>2</lineNumber>
</elementManagementItinerary>
<travelProduct>
<product>
<depDate>120215</depDate>
<depTime>0745</depTime>
<arrDate>120215</arrDate>
<arrTime>0920</arrTime>
</product>
<boardpointDetail>
<cityCode>SYD</cityCode>
</boardpointDetail>
<offpointDetail>
<cityCode>MEL</cityCode>
</offpointDetail>
<companyDetail>
<identification>QF</identification>
</companyDetail>
<productDetails>
<identification>413</identification>
<classOfService>G</classOfService>
</productDetails>
<typeDetail>
<detail>ET</detail>
</typeDetail>
</travelProduct>
<itineraryMessageAction>
<business>
<function>1</function>
</business>
</itineraryMessageAction>
<itineraryReservationInfo>
<reservation>
<companyId>QF</companyId>
<controlNumber>3H4NLL</controlNumber>
</reservation>
</itineraryReservationInfo>
<relatedProduct>
<quantity>1</quantity>
<status>HK</status>
</relatedProduct>
<flightDetail>
<productDetails>
<equipment>73H</equipment>
<numOfStops>0</numOfStops>
<weekDay>4</weekDay>
</productDetails>
<departureInformation>
<departTerminal>3</departTerminal>
</departureInformation>
<arrivalStationInfo>
<terminal>1</terminal>
</arrivalStationInfo>
</flightDetail>
<selectionDetails>
<selection>
<option>P2</option>
</selection>
</selectionDetails>
<markerRailTour/>
</itineraryInfo>
</originDestinationDetails>
<dataElementsMaster>
<marker2/>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>105</number>
</reference>
<segmentName>AP</segmentName>
<lineNumber>3</lineNumber>
</elementManagementData>
<otherDataFreetext>
<freetextDetail>
<subjectQualifier>3</subjectQualifier>
<type>5</type>
</freetextDetail>
<longFreetext>SYD 61 02 96915783 INVALID PLEASE UPDATE-B</longFreetext>
</otherDataFreetext>
<referenceForDataElement>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</referenceForDataElement>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>106</number>
</reference>
<segmentName>AP</segmentName>
<lineNumber>4</lineNumber>
</elementManagementData>
<otherDataFreetext>
<freetextDetail>
<subjectQualifier>3</subjectQualifier>
<type>5</type>
</freetextDetail>
<longFreetext>SYD 61 0407 120988 INVALID PLEASE UPDATE-M</longFreetext>
</otherDataFreetext>
<referenceForDataElement>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</referenceForDataElement>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>173</number>
</reference>
<segmentName>AP</segmentName>
<lineNumber>5</lineNumber>
</elementManagementData>
<otherDataFreetext>
<freetextDetail>
<subjectQualifier>3</subjectQualifier>
<type>5</type>
</freetextDetail>
<longFreetext>131313</longFreetext>
</otherDataFreetext>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>107</number>
</reference>
<segmentName>AP</segmentName>
<lineNumber>6</lineNumber>
</elementManagementData>
<otherDataFreetext>
<freetextDetail>
<subjectQualifier>3</subjectQualifier>
<type>P02</type>
</freetextDetail>
<longFreetext>CHRISTIANDISISTO@QANTAS.COM.AU</longFreetext>
</otherDataFreetext>
<referenceForDataElement>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</referenceForDataElement>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>115</number>
</reference>
<segmentName>TK</segmentName>
<lineNumber>7</lineNumber>
</elementManagementData>
<ticketElement>
<ticket>
<indicator>OK</indicator>
<date>291014</date>
<officeId>SYDQF0115</officeId>
</ticket>
</ticketElement>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>235</number>
</reference>
<segmentName>SSR</segmentName>
<lineNumber>8</lineNumber>
</elementManagementData>
<serviceRequest>
<ssr>
<type>NSST</type>
<status>HK</status>
<quantity>1</quantity>
<companyId>QF</companyId>
<boardpoint>SYD</boardpoint>
<offpoint>MEL</offpoint>
</ssr>
<ssrb>
<data>19A</data>
<crossRef>46</crossRef>
<seatType>N</seatType>
<seatType>W</seatType>
<seatType>FC</seatType>
</ssrb>
</serviceRequest>
<seatPaxInfo>
<seatPaxDetails>
<genericDetails>
<seatCharacteristic>N</seatCharacteristic>
<seatCharacteristic>W</seatCharacteristic>
</genericDetails>
</seatPaxDetails>
<crossRef>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</crossRef>
</seatPaxInfo>
<referenceForDataElement>
<reference>
<qualifier>ST</qualifier>
<number>2</number>
</reference>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</referenceForDataElement>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>114</number>
</reference>
<segmentName>SSR</segmentName>
<lineNumber>9</lineNumber>
</elementManagementData>
<serviceRequest>
<ssr>
<type>GRPF</type>
<status/>
<companyId>YY</companyId>
<freeText>NRT450</freeText>
</ssr>
</serviceRequest>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>122</number>
</reference>
<segmentName>SSR</segmentName>
<lineNumber>10</lineNumber>
</elementManagementData>
<serviceRequest>
<ssr>
<type>FQTV</type>
<status>HK</status>
<quantity>1</quantity>
<companyId>QF</companyId>
<indicator>P02</indicator>
</ssr>
</serviceRequest>
<frequentFlyerInformationGroup>
<frequentTravellerInfo>
<frequentTraveler>
<company>QF</company>
<membershipNumber>3852439</membershipNumber>
</frequentTraveler>
<priorityDetails>
<qualifier>1</qualifier>
<priorityCode>7</priorityCode>
<tierLevel>FFBR</tierLevel>
</priorityDetails>
</frequentTravellerInfo>
</frequentFlyerInformationGroup>
<referenceForDataElement>
<reference>
<qualifier>PT</qualifier>
<number>46</number>
</reference>
</referenceForDataElement>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<reference>
<qualifier>OT</qualifier>
<number>354</number>
</reference>
<segmentName>SSR</segmentName>
<lineNumber>11</lineNumber>
</elementManagementData>
<serviceRequest>
<ssr>
<type>GRPS</type>
<status/>
<companyId>YY</companyId>
<freeText>TCP50TESTQANTAS</freeText>
</ssr>
</serviceRequest>
</dataElementsIndiv>
<dataElementsIndiv>
<elementManagementData>
<segmentName>SP</segmentName>
</elementManagementData>
<referencedRecord>
<referencedReservationInfo>
<reservation>
<companyId>1A</companyId>
<controlNumber>3HZOVW</controlNumber>
<controlType>P</controlType>
<date>311014</date>
</reservation>
</referencedReservationInfo>
<securityInformation>
<responsibilityInformation>
<typeOfPnrElement>SP</typeOfPnrElement 

UCL & Java Verbs

  • Important to keep the domain context right for interaction
  • JS [Dwis] & Java [quadroo] library for  Domain driver: filght23.delhi.seatE9.breakfast locates the breakfast menu for a partiular passenger ,[flight attendant donot care of name of passenger]
  •  Quadroo server built from ground up to interpret UCLS and act on java verbs  [small chunk of code]
  • GitHub : https://github.com/spicecoder/NodeJavaTunnel

Quadroo Verb Benifit 

Quadroo allows a new java class written with 

specified pattern as below to be deployable right away by simple copying the class in the war file, no extra configuration needed.

Quadroo Verb  pattern:

 

public class ASWord_S extends QuadRR {

public ASWord_S(QuadRR rr) {
		 super(rr);
	 	              ...detail logic here  }

Text

Text

Quadroo Support For UCL 

UCL are based on words in dictionary taking part as 

names in JSON and maintains a currency.

Quadroo has built in support for UCL intepretation and

Mongo data base integration

Scripting with  Node factor

Node.js  makes socket IO responsive.

The feedback loop is more important for humans with devices

Service Consumer:"I want a Double Yummy Burger"

Service Desk : Yes here is your number now go &relax!

 

Who is using ?

Linkedin

Paypal & 1000..more:

 https://github.com/joyent/node/wiki/projects,-applications,-and-companies-using-node

A jingle, the node song :

www.youtube.com/watch?v=IkmHStAWXis

 

 

 

 

HTTP/SOAP

*Redundant Payload [xml and http headers etc-legacy]

*expensive[thread bound] network connect

* dedicated mobile resouce

for the time of transaction

*synchronous request 

response ties up resources  

Socket/JSON

* min management  payload

* duplex [2WAY] ,event driven connection

* cheap node.js connections

asynchronous i/o

* mobile resources free during transaction execution

* asynchronous call

UCL makes it contextual

Meeting the Complexity

Node.js / javascript is 

BAD for complexity management [both algorithmic and understanability ]E.G:

simple as XML parsing to a multiple depth ..or.. 

'find the next leg of the flight that starts from Delhi or give window seat next to facilities'

 

Java good 

but need more

Java has the wisdom of programming complex algorithm that needs building on abstraction.

Java still needs help in context management in a dynamic world .

UCL is the uniform context language that builds on domain driven words-for managing contexts extends Json

What we get

Responsive  UI ;

Disposable devices;

Allways in Sync To Data Source [web and native ubiquity]

On time notification of truth from Source [ucl socket]

Content Presented for Action in Context [through async microservice]

 

 

Added Benifit

  • Quadroo Open Source 
  • More than 3000 lines of tested java code
  • Original Developer participation
  • Community  contribution or fork
  • Can be setup as a micro service POC within Quatas.com in 4-5 weeks.
  • open source UCL gui in todo list

B Benefit: A solid Custom made App platform to grow in parallel

  • In Apps Browser/WebView/Native allways in Sync
  • Client profile specific intelligence conversation
  • Response faster because async events+context io
  • Fast simple deployment of java verbs 
  • json + UCL  structure on mobile side
  • better connection usage with GDS
  •  embrace devices and beacons as context pointers
  • Context for every customer respected 
  • Context is persisted for every customer in mongo

A smooth transition path for device ready App  

Numerous Device and beacons will be trying to talk to the App in context.

beacon is guiding passenger where is the departure gate

thru bluetooth /near magnetic fields 

We need to manage context of these interaction through the App

How can we embed the solutions  in today infrastructure   and still give a super  device  & UI experience? 

 

 

 

Q&A 

Thank You

Business Case for Socket IO Mobile Development

By Pronab Pal

Business Case for Socket IO Mobile Development

Asynchronous, Small chunks Of Data

  • 736