41
Reliability through highly reproducible systems Peter Lawrey - CEO of Higher Frequency Trading QCon London - 2017 Latency Sensitive Microservices in Java

Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Reliabilitythroughhighlyreproduciblesystems

Peter Lawrey - CEO of Higher Frequency TradingQCon London - 2017

LatencySensitiveMicroservices inJava

Page 2: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

PeterLawrey

JavaDeveloper/Consultantforinvestmentbanksandhedgefunds

for10years.

MostanswersforJavaandJVMonstackoverflow.com

Page 3: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

TypicalSolutionsMarketdataprocessinganddistributionOrdergenerationandmanagementPositionnotificationanddistributionRealtimeCompliance

30micro-secondstypical,100micro-seconds,99%ofthetime

Page 4: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Reliabilitymeans

Correctbehaviourordie

Page 5: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

128 KB RAM

Page 6: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Togofaster,doless

Perfectionisachieved,notwhenthereisnothingmoretoadd,butwhenthereisnothinglefttotakeaway.

AntoinedeSaint-Exupery

Page 7: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Togofasteruseprivatedata

Micro-servicesdosomethingsimplewithprivatelyhelddata.

Cache Size ClockCycles

Private

L1Instruction 32KB 3 Yes

L1Data 32KB 3 Yes

L2Cache 256KB 10 Yes

L3Cache 1MB–48MB

40- 70 NO

Page 8: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

AComputerisaDistributedSystem.

Whenyouareconsideringshorttimescalesof10micro-secondsorless,youhavetoconsiderthateachcoreasaprocessorofit’sown.Eachcore• hasit’sownmemory(L1&L2caches)• canrunindependently• communicateswithothercoresviaaL2cache

coherencebus.

Page 9: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant
Page 10: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant
Page 11: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant
Page 12: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Buildinghighlyreproduciblesystems

Eachoutputistheresultofoneinputmessage.Thisisusefulforgateways,bothinandoutofyour

system.Highlyconcurrent.

Page 13: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Buildinghighlyreproduciblesystems

EachoutputistheresultofALLtheinputs.InsteadofreplyingALLinputmessageeachtime,theFunction

couldsaveanaccumulatedstate.

Page 14: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Yourcriticalpathasaseriesoflowlatency,nonblockingtasks.Thiskeepsyourlatencies

endtoendconsistentlylow.

Page 15: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant
Page 16: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Recordeverythingmeans

GreaterTransparencyHighReproducibilityFastertimetofix

Fasterdeliveryofaqualitysystem

Page 17: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Isrecordingeverythingrealist?

Cost?Performance?TBsinJava?FlowControl?

Page 18: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Howmuchdoesrecordeverythingcost

2TBSSD~£1K

Page 19: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

ScaletohighvolumeswithlessmemoryWriting1TBona128GBmachine

Page 20: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

ScaletohighvolumeswithlessmemoryWriting1TBona128GBmachine

Page 21: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Scaletohighthroughputwithlowlatencies.

Page 22: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

NoFlowControl?

MarketData

Compliance

Page 23: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Reproduceeachcomponentindependently

Whetheryouareenrichingdatafromadatabaseorproductioniscomplex,eachservicecanbetestedin

isolation.

Page 24: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

TestingandDebuggingMicroservices

Frameworkscanmaketestinganddebuggingharder.

Youneedtobeabletotestanddebugyourcomponentswithouttheframework,oratransport.

Page 25: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

TurningaMonolithintoMicroservices

BusinessComponent+Transport=Service.

Page 26: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Startingwithasimplecontract

Anasynchronousmessagehasatype,apayloadanddoesn’treturnaresult.

public interface SidedMarketDataListener {void onSidedPrice(SidedPrice sidedPrice);

}

public interface MarketDataListener {void onTopOfBookPrice(TopOfBookPrice price);

}

Page 27: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

ADataTransferObjectpublic class SidedPrice extends AbstractMarshallable {

String symbol;long timestamp;Side side;double price, quantity;

public SidedPrice(String symbol, long timestamp, Side side, double price, double quantity) {

this.symbol = symbol;this.timestamp = timestamp;this.side = side;this.price = price;this.quantity = quantity;return this;

}}

Page 28: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Deserializable toString()Forittodeserialize thesameobject,noinformationcanbelost,whichusefultocreatingtestobjectsfromproductionlogs.

SidedPrice sp = new SidedPrice("Symbol", 123456789000L, Side.Buy, 1.2345, 1_000_000);

assertEquals("!SidedPrice {\n" +" symbol: Symbol,\n" +" timestamp: 123456789000,\n" +" side: Buy,\n" +" price: 1.2345,\n" +" quantity: 1000000.0\n" +"}\n", sp.toString());

// from stringSidedPrice sp2 = Marshallable.fromString(sp.toString());assertEquals(sp2, sp);assertEquals(sp2.hashCode(), sp.hashCode());

Page 29: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Writingasimplecomponent

Wehaveacomponentwhichimplementsourcontractandinturncallsanotherinterfacewitharesult

public class SidedMarketDataCombinerimplements SidedMarketDataListener {

final MarketDataListener mdListener;

public SidedMarketDataCombiner(MarketDataListener mdListener) {this.mdListener = mdListener;

}

Page 30: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Writingasimplecomponent

Thecomponentcalculatesaresult,usingprivatestate.

final Map<String, TopOfBookPrice> priceMap = new TreeMap<>();

public void onSidedPrice(SidedPrice sidedPrice) {TopOfBookPrice price = priceMap.computeIfAbsent(

sidedPrice.symbol, TopOfBookPrice::new);if (price.combine(sidedPrice))

mdListener.onTopOfBookPrice(price);}

Page 31: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Testingoursimplecomponent

Wecanmocktheoutputlistenerofourcomponent.

MarketDataListener listener = createMock(MarketDataListener.class);listener.onTopOfBookPrice(new TopOfBookPrice("EURUSD", 123456789000L,

1.1167, 1_000_000, Double.NaN, 0));listener.onTopOfBookPrice(new TopOfBookPrice("EURUSD", 123456789100L,

1.1167, 1_000_000, 1.1172, 2_000_000));replay(listener);

SidedMarketDataListener combiner = new SidedMarketDataCombiner(listener);combiner.onSidedPrice(new SidedPrice("EURUSD", 123456789000L,

Side.Buy, 1.1167, 1e6));combiner.onSidedPrice(new SidedPrice("EURUSD", 123456789100L,

Side.Sell, 1.1172, 2e6));

verify(listener);

Page 32: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

TestingmultiplecomponentsWecanmocktheoutputlistenerofourcomponent.

// what we expect to happenOrderListener listener = createMock(OrderListener.class);

listener.onOrder(new Order("EURUSD", Side.Buy, 1.1167, 1_000_000));

replay(listener);

// build our scenarioOrderManager orderManager =

new OrderManager(listener);

SidedMarketDataCombiner combiner =new SidedMarketDataCombiner(orderManager);

Page 33: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Testingmultiplecomponents

// events in: not expected to triggerorderManager.onOrderIdea(

new OrderIdea("EURUSD", Side.Buy, 1.1180, 2e6));

combiner.onSidedPrice(new SidedPrice("EURUSD", 123456789000L, Side.Sell, 1.1172, 2e6));

combiner.onSidedPrice(new SidedPrice("EURUSD", 123456789100L, Side.Buy, 1.1160, 2e6));

combiner.onSidedPrice(new SidedPrice("EURUSD", 123456789100L, Side.Buy, 1.1167, 2e6));

// expected to triggerorderManager.onOrderIdea(

new OrderIdea("EURUSD", Side.Buy, 1.1165, 1e6));

verify(listener);

Page 34: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Addingatransport

Anymessagingsystemcanbeusedasatransport.Youcanuse• RESTorHTTP• JMS,Akka,MPI• AeronoraUDPbasedtransport.• RawTCPorUDP.• ChronicleQueue.

Page 35: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Makingmessagestransparent

--- !!data #binaryonOrderIdea: {

symbol: EURUSD,side: Buy,limitPrice: 1.118,quantity: 2000000.0

}

orderManager.onOrderIdea(new OrderIdea("EURUSD", Side.Buy, 1.1180, 2e6));

Page 36: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

WhyuseChronicleQueue

ChronicleQueuev4hasanumberofadvantages• Brokerless,onlytheOSneedstobeup.• Lowlatency,lessthan10microseconds99%ofthe

time.• Persisted,givingyourreplayandtransparency.• Canreplaceyourloggingimprovingperformance.• KernelBypass,SharedacrossJVMswithasystemcall

foreachmessage.

Page 37: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

--- !!meta-data #binaryheader: !SCQStore { wireType: !WireType BINARY, writePosition: 777, roll: !SCQSRoll { length: 86400000, format: yyyyMMdd, epoch: 0 }, indexing: !SCQSIndexing { indexCount: !int 8192, indexSpacing: 64, index2Index: 0, lastIndex: 0 } }

# position: 227 --- !!data #binaryonOrderIdea: { symbol: EURUSD, side: Buy, limitPrice: 1.118, quantity: 2000000.0 }

# position: 306 --- !!data #binaryonTopOfBookPrice: { symbol: EURUSD, timestamp: 123456789000, buyPrice: NaN, buyQuantity: 0, sellPrice: 1.1172, sellQuantity: 2000000.0 }

# position: 434 --- !!data #binaryonTopOfBookPrice: { symbol: EURUSD, timestamp: 123456789100, buyPrice: 1.116, buyQuantity: 2000000.0, sellPrice: 1.1172, sellQuantity: 2000000.0 }

# position: 566 --- !!data #binaryonTopOfBookPrice: { symbol: EURUSD, timestamp: 123456789100, buyPrice: 1.1167, buyQuantity: 2000000.0, sellPrice: 1.1172, sellQuantity: 2000000.0 }

# position: 698 --- !!data #binaryonOrderIdea: { symbol: EURUSD, side: Buy, limitPrice: 1.1165, quantity: 1000000.0 } ... # 83885299 bytes remaining

Page 38: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Measuringtheperformance?MeasurethewritelatencywithJMH(JavaMicrobenchmarkHarness)

Percentiles, us/op:

p(0.0000) = 2.552 us/op

p(50.0000) = 2.796 us/op

p(90.0000) = 5.600 us/op

p(95.0000) = 5.720 us/op

p(99.0000) = 8.496 us/op

p(99.9000) = 15.232 us/op

p(99.9900) = 19.977 us/op

p(99.9990) = 422.475 us/op

p(99.9999) = 438.784 us/op

p(100.0000) = 438.784 us/op

Page 39: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant
Page 40: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

WherecanItrythisout?

LowLatencyMicroservicesexampleshttps://github.com/Vanilla-Java/Microservices

TheOSSChronicleproductsareavailablehttps://github.com/OpenHFT/

Page 41: Latency Sensitive Microservicesin Java · Peter Lawrey -CEO of Higher Frequency Trading QConLondon -2017 Latency Sensitive Microservicesin Java. Peter Lawrey Java Developer / Consultant

Q&A

Blog:http://vanilla-java.github.io/

http://chronicle.software

@ChronicleUG

[email protected]

https://groups.google.com/forum/#!forum/java-chronicle