SlideShare a Scribd company logo
1 of 91
OLIVIER
COANET
Le Disruptor à ABC Arbitrage :
une histoire, des patterns
PerfUG Paris 21/03/2018
A B C
abc-arbitrage.com
github.com/Abc-Arbitrage
Part 1
THE STORY
2010
AUTOTRADING
FRAMEWORK
C++
C#
VS
2011
2011
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1516
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Disruptor!
BY LMAX Exchange
2011
0 1
2
3
4
5
6
7
8
9
10
11
12
13
14151617
18
19
20
21
22
23
24
25
26
27
28
29
30 31
Consumer 1
Consumer 2
Consumer 3
Head
2011
Hold on…
2011
Port
2011
Order Router
First .NET low latency
component
2012
NextGen
.NET trading platform
2014
.NET Disruptor maintainers
github.com/disruptor-net/Disruptor-net
2016
Boring
technology
2018
Part 2
PATTERNS
FRAMEWORK
LIBRARY
VS
A
D
G
I
B
H
C
E
A
D
G
I
B
H
C
E
FRAMEWORK!
Framework edge #1
Enforce a clean design
Framework edge #2
Single-threaded business
components
Framework edge #2
Single-threaded business
components
- Focus on business logic
Framework edge #2
Single-threaded business
components
- Focus on business logic
- Quant friendly
Framework edge #2
Single-threaded business
components
- Focus on business logic
- Quant friendly
- Deterministic behavior
Framework edge #3
Performance
+
EVENTS
EVENT HANDLERS
Disruptor < >T
XEngine
Let me introduce the
public enum XEventType
{
None,
MarketData,
Execution,
Acknowledgement,
TradingSignal1,
TradingSignal2,
// many other values...
}
The obvious enum
obvious enum is obvious
public class MarketDataInfo
{
public int SecurityId;
public long BidPrice;
public long AskPrice;
}
public class ExecutionInfo
{
public int SecurityId;
public long Price;
public long Quantity;
public string ExecutionCode;
}
// ...
public class XEvent
{
public XEventType EventType;
public MarketDataInfo MarketData;
public ExecutionInfo Execution;
public TradingSignal1Info TradingSignal1;
// ...
Option #1 Members for all event types
public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
switch (data.EventType)
{
case XEventType.MarketData:
OnMarketData(ref data.MarketData);
break;
case XEventType.Execution:
OnExecution(ref data.Execution);
break;
// ...
Not as bad as it looks…
…up to a point
public class XEvent
{
public XEventType EventType;
public object EventData;
}
Option #2 Allocate or pool the event data
public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
switch (data.EventType)
{
case XEventType.MarketData:
OnMarketData((MarketDataInfo)data.EventData);
break;
case XEventType.Execution:
OnExecution((ExecutionInfo)data.EventData);
break;
// ...
You just scrapped pre-
fetching and introduced
extra synchronization
Congratulations!
public class XEvent
{
public XEventType EventType;
public EventInfo EventData;
[StructLayout(LayoutKind.Explicit)]
public struct EventInfo
{
[FieldOffset(0)]
public ExecutionInfo Execution;
[FieldOffset(0)]
public MarketDataInfo MarketData;
}
Option #3 Unions
public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
switch (data.EventType)
{
case XEventType.MarketData:
OnMarketData(ref data.EventData.MarketData);
break;
case XEventType.Execution:
OnExecution(ref data.EventData.Execution);
break;
// ...
Clean and packed…
…but requires caution
[StructLayout(LayoutKind.Explicit)]
public struct ExecutionInfo
{
[FieldOffset(0)]
public string ExecutionCode;
[FieldOffset(8)]
public int SecurityId;
[FieldOffset(12)]
public long Price;
[FieldOffset(20)]
public long Quantity;
}
[StructLayout(LayoutKind.Explicit)]
public struct MarketDataInfo
{
[FieldOffset(0)]
private object _padding0;
[FieldOffset(8)]
public int SecurityId;
[FieldOffset(12)]
public long BidPrice;
[FieldOffset(20)]
public long AskPrice;
}
…and .NET specific
public class XEvent
{
public XEventType EventType;
public ByteBuffer EventData;
// use a zero-copy wrapper like flatbuffer
// to read or write your event data
Option #4 LMAX style
Disruptor(Func<T> eventFactory,
int ringBufferSize,
TaskScheduler taskScheduler)
more choices…
int ringBufferSize
The disruptor is a
/BOUNDED/ queue
Unbounded queue aren’t
ringBuffer.Next()
ringBuffer.TryNext()
Backpressure
Retry / Drop
Keep queue sizes low
Pay attention to
backpressure locks
Use small ring buffer
sizes in test
environments
SHARED STATE
public interface IFxRateSource
{
NumericValue? GetFxRate(int currencyId);
}
public interface IFxRateManager : IFxRateSource
{
void UpdateFxRate(int currencyId, NumericValue value);
}
The shared type
The shared type
WRONG
IFxRateManager
Engine EEngine D
Engine C
Engine B
Engine A
Producer
Design principle #1
Stay away from any form
of synchronization
All state changes must
be the result of events
Design principle #2
Engine A Engine B Engine C
Enqueue multiple times
Store data locally in every consumer
FX rate producer
Engine A Engine B Engine C
FX rate producer
Engine A Engine B Engine C
FX rate producer
Engine A Engine B Engine C
FX rate producer
enqueue
enqueue
enqueue
Isolated Immutable Synchronized> >
CONFLATION
OPTIONS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
151617
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Event 9:
FX rate update
for currency A
Event 7:
FX rate update
for currency A
Consumer
Head
Conflation option #1
No conflation
YAGNI
Conflation option #2
Synchronization-based
NIH
private Dictionary<int, FxRateConflater> _conflaters;
public void Publish(int currencyId, FxRate fxRate)
{
_conflaters[currencyId].AddOrMerge(fxRate);
}
Producer side (1/3)
public void AddOrMerge(FxRate fxRate)
{
lock (_lock) // consider using a SpinLock
{
if (_currentEvent == null)
Add(fxRate);
else
Merge(fxRate);
}
}
Producer side (2/3)
private void Add(FxRate fxRate)
{
var sequence = _ringBuffer.Next();
_currentEvent = _ringBuffer[sequence];
_currentEvent.SetFxRate(_currencyId, this, fxRate);
_ringBuffer.Publish(sequence);
}
private void Merge(FxRate fxRate)
{
_currentEvent.FxRate.MergeWith(fxRate);
}
Producer side (3/3)
public void Detach()
{
lock (_lock) // consider using a SpinLock
{
_currentEvent = null;
}
}
Consumer side (1/1)
Conflation option #3
Batch-based
KISS
public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
AddToBatchOrMerge(data);
if (endOfBatch)
{
ProcessBatch();
ClearBatch();
}
}
Consumer side (1/3)
private void AddToBatchOrMerge(XEvent data)
{
if (data.EventType == XEventType.FxRate)
{
var currencyId = data.FxRate.CurrencyId;
if (_fxEvents.TryGetValue(currencyId, out var previous))
{
Merge(ref data.FxRate, ref previous.FxRate);
return;
}
_fxEvents.Add(currencyId, data);
}
_batchEvents.Add(data);
}
Consumer side (2/3)
private void ProcessBatch()
{
foreach (var data in _batchEvents)
{
ProcessEvent(data);
}
}
private void ClearBatch()
{
_batchEvents.Clear();
_fxEvents.Clear();
}
Consumer side (3/3)
EVENT HANDLER
COMPOSITION
Handler 1 Critical
Handler 2 Critical
Handler 3 Non critical, fast
Handler 4 Non critical, fast
Handler 5 Non critical, slow
Logical
Physical
Design and
testing unit
Execution and
queueing unit
public class CompositeEventHandler<T> : IEventHandler<T>
{
private readonly List<IEventHandler<T>> _handlers;
// ...
public void OnEvent(T data, long seq, bool endOfBatch)
{
foreach (var handler in _handlers)
{
handler.OnEvent(data, sequence, endOfBatch);
}
}
}
Handler 1 Critical
+
Handler 2 Critical
Handler 3 Non critical, fast
+
Handler 4 Non critical, fast
Handler 5 Non critical, slow
BINARY LOGS
Binary log used as a
source of state
Journaling mode
Not so simple
Journaling mode
Binary logger handler
Business handler
Other handlers…
Journaling mode
Binary logger handler
Business handler
Other handlers…
Unsafe mode
Binary logs unusable as a
source of state, but…
Unsafe mode
An invaluable
debugging mechanism
Unsafe mode
A source of data for
business analysis
Unsafe mode
A source of data for
technical analysis
Unsafe mode
But requires
thoroughness
Unsafe mode
Conclusion
The end
OLIVIER
COANET
Thanks to @romainverdier and
@MendelMonteiro for the reviews

More Related Content

What's hot

20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
Computer Science Club
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
Aqib Memon
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
Aqib Memon
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
Aqib Memon
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
Aqib Memon
 

What's hot (20)

20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
OpenGL ES 3 Reference Card
OpenGL ES 3 Reference CardOpenGL ES 3 Reference Card
OpenGL ES 3 Reference Card
 
OpenVX 1.2 Reference Guide
OpenVX 1.2 Reference GuideOpenVX 1.2 Reference Guide
OpenVX 1.2 Reference Guide
 
Some examples of the 64-bit code errors
Some examples of the 64-bit code errorsSome examples of the 64-bit code errors
Some examples of the 64-bit code errors
 
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
 
OpenGL 4.6 Reference Guide
OpenGL 4.6 Reference GuideOpenGL 4.6 Reference Guide
OpenGL 4.6 Reference Guide
 
OpenGL ES 3.1 Reference Card
OpenGL ES 3.1 Reference CardOpenGL ES 3.1 Reference Card
OpenGL ES 3.1 Reference Card
 
Varnish kann alles
Varnish kann allesVarnish kann alles
Varnish kann alles
 
glTF 2.0 Reference Guide
glTF 2.0 Reference GuideglTF 2.0 Reference Guide
glTF 2.0 Reference Guide
 
Cocos2d Performance Tips
Cocos2d Performance TipsCocos2d Performance Tips
Cocos2d Performance Tips
 
Efficient SIMD Vectorization for Hashing in OpenCL
Efficient SIMD Vectorization for Hashing in OpenCLEfficient SIMD Vectorization for Hashing in OpenCL
Efficient SIMD Vectorization for Hashing in OpenCL
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
 
Atm machine using c++
Atm machine using c++Atm machine using c++
Atm machine using c++
 
OpenGL 4.5 Reference Card
OpenGL 4.5 Reference CardOpenGL 4.5 Reference Card
OpenGL 4.5 Reference Card
 
Singly Linked List
Singly Linked ListSingly Linked List
Singly Linked List
 
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
 
Prog iv
Prog ivProg iv
Prog iv
 
Bitcoin:Next
Bitcoin:NextBitcoin:Next
Bitcoin:Next
 

Similar to PerfUG - Disruptor at ABC Arbitrage - March 2018

Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
knight1128
 
Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)
Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)
Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)
Igalia
 

Similar to PerfUG - Disruptor at ABC Arbitrage - March 2018 (20)

Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL...
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL...apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL...
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL...
 
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache BeamGDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to Griffon
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
#JavaFX.forReal() - ElsassJUG
#JavaFX.forReal() - ElsassJUG#JavaFX.forReal() - ElsassJUG
#JavaFX.forReal() - ElsassJUG
 
First Failure Data Capture for your enterprise application with WebSphere App...
First Failure Data Capture for your enterprise application with WebSphere App...First Failure Data Capture for your enterprise application with WebSphere App...
First Failure Data Capture for your enterprise application with WebSphere App...
 
Oczyszczacz powietrza i stos sieciowy? Czas na test! Semihalf Barcamp 13/06/2018
Oczyszczacz powietrza i stos sieciowy? Czas na test! Semihalf Barcamp 13/06/2018Oczyszczacz powietrza i stos sieciowy? Czas na test! Semihalf Barcamp 13/06/2018
Oczyszczacz powietrza i stos sieciowy? Czas na test! Semihalf Barcamp 13/06/2018
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?
 
Programming smart contracts in solidity
Programming smart contracts in solidityProgramming smart contracts in solidity
Programming smart contracts in solidity
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#
 
C#, What Is Next?
C#, What Is Next?C#, What Is Next?
C#, What Is Next?
 
Verilog overview
Verilog overviewVerilog overview
Verilog overview
 
Building Hierarchy
Building HierarchyBuilding Hierarchy
Building Hierarchy
 
2. Design patterns. part #2
2. Design patterns. part #22. Design patterns. part #2
2. Design patterns. part #2
 
Treinamento Qt básico - aula II
Treinamento Qt básico - aula IITreinamento Qt básico - aula II
Treinamento Qt básico - aula II
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)
Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)
Stranger in These Parts. A Hired Gun in the JS Corral (JSConf US 2012)
 
Devoxx 2015 - Building the Internet of Things with Eclipse IoT
Devoxx 2015 - Building the Internet of Things with Eclipse IoTDevoxx 2015 - Building the Internet of Things with Eclipse IoT
Devoxx 2015 - Building the Internet of Things with Eclipse IoT
 

Recently uploaded

VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
amitlee9823
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
ankushspencer015
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ssuser89054b
 

Recently uploaded (20)

Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced LoadsFEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
 
Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01
 
Block diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptBlock diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.ppt
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
University management System project report..pdf
University management System project report..pdfUniversity management System project report..pdf
University management System project report..pdf
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
 

PerfUG - Disruptor at ABC Arbitrage - March 2018