SlideShare a Scribd company logo
1 of 47
Download to read offline
Wangle调研
chenxiaojie@qiyi.com
2016.07.16
Content
• Example
• Features
• Architecture
• Summary
Example
Server
ServerBootstrap<SerializePipeline>()
// .pipeline(RoutingDataPipelineFactory())
.childPipeline(RpcPipelineFactory())
// .group(IOThreadPoolExecutor(), IOThreadPoolExecutor())
// .acceptorConfig(…)
.bind(6666)
.waitForStop();
Server Bootstrap
Pipeline
class RpcPipelineFactory : public … {
public:
SerializePipelinePtr newPipeline(AsyncTransport sock) {
auto pipeline = SerializePipeline::create();
pipeline->addBack(AsyncSocketHandler(sock));
pipeline->addBack(EventBaseHandler());
pipeline->addBack(LengthFieldBasedFrameDecoder());
pipeline->addBack(LengthFieldPrepender());
pipeline->addBack(ServerSerializeHandler());
pipeline->addBack(MultiplexServerDispatcher<Bonk, Xtruct>(&service_));
pipeline->finalize();
return pipeline;
}
private:
RpcService<Bonk, Xtruct> service_;
};
Pipeline
LengthFieldBasedFrameDecoder
EventBaseHandler
AsyncSocketHandler
event
LengthFieldPrepender
ServerSerializeHandler
MultiplexServerDispatcher
Service
LengthFieldBasedFrameDecoder
EventBaseHandler
AsyncSocketHandler
LengthFieldPrepender
ServerSerializeHandler
MultiplexServerDispatcher
RPC Protocol
class ServerSerializeHandler : public … {
public:
void read(Context* ctx, IOBuf msg) override {
Bonk received;
ser.deserialize<Bonk>(msg, &received);
ctx->fireRead(received);
}
Future<Unit> write(Context* ctx, Xtruct b) override {
string out;
ser.serialize<Xtruct>(b, &out);
return ctx->fireWrite(out);
}
private:
ThriftSerializerCompact<> ser;
};
RPC Handler
class RpcService : public Service<Bonk, Xtruct> {
public:
virtual Future<Xtruct> operator()(Bonk request) override {
return makeFuture()
.via(getIOExecutor())
.then(getCouchbaseResult())
.via(getCpuExecutor())
.then(calculate1())
.via(getIOExecutor())
.then(getCtrServerResult())
.then(calculate2())
.then(getRedisResult())
.then(calculate3())
.then(sendResponse());
}
};
Client
ClientBootstrap<SerializePipeline> client;
auto pipeline = client
.client.group(IOThreadPoolExecutor>());
.client.pipelineFactory(RpcPipelineFactory());
.client.connect(address).get();
BonkMultiplexClientDispatcher service;
service.setPipeline(pipeline);
while (true) {
Bonk request;
service(request).then([](Xtruct response) {
cout << response.string_thing << endl;
});
}
Pipeline
class RpcPipelineFactory : public … {
public:
SerializePipelinePtr newPipeline(AsyncTransport sock) override {
auto pipeline = SerializePipeline::create();
pipeline->addBack(AsyncSocketHandler(sock));
pipeline->addBack(EventBaseHandler());
pipeline->addBack(LengthFieldBasedFrameDecoder());
pipeline->addBack(LengthFieldPrepender());
pipeline->addBack(ClientSerializeHandler());
pipeline->finalize();
return pipeline;
}
};
Pipeline
LengthFieldBasedFrameDecoder
EventBaseHandler
AsyncSocketHandler
LengthFieldPrepender
ClientSerializeHandler
Service
EventBase
LengthFieldBasedFrameDecoder
EventBaseHandler
AsyncSocketHandler
LengthFieldPrepender
ClientSerializeHandler
RPC Protocol
class ClientSerializeHandler : public … {
public:
void read(Context* ctx, IOBuf msg) override {
Xtruct received;
ser.deserialize<Xtruct>(msg, &received);
ctx->fireRead(received);
}
Future<Unit> write(Context* ctx, Bonk b) override {
string out;
ser.serialize<Bonk>(b, &out);
return ctx->fireWrite(out);
}
private:
ThriftSerializerCompact<> ser;
};
RPC Handler
class BonkMultiplexClientDispatcher : public … {
public:
void read(Context* ctx, Xtruct in) override {
auto search = requests_.find(in.i32_thing);
auto p = move(search->second);
requests_.erase(in.i32_thing);
p.setValue(in);
}
Future<Xtruct> operator()(Bonk arg) override {
auto& p = requests_[arg.type];
auto f = p.getFuture();
this->pipeline_->write(arg);
return f;
}
private:
unordered_map<int32_t, Promise<Xtruct>> requests_;
};
Features
Executor
• IOThreadPoolExecutor:
• IO intensive
• one event loop, notification queue(eventfd) per thread
• round robin, user define
• MPSC
• CPUThreadPoolExecutor:
• CPU intensive
• multi-threads single queue
• MPMC Queue, LIFO wakeup, cache efficiency
• ThreadedExecutor
• FiberIOExecutor(stackful)
• FutureExecutor
MPMC Queue
• LIFO Semaphore:
• approximately LIFO
• multi-post, exact wakeups, fewer system calls than sem_t
• MPMC Queue:
• fixed capacity, blocking or throw exception
• incremental ticket based, item index = hash(ticket)
• if holds item, wait for turn, else write the element
• a read ticket with same growing rule
• get the right version of element with ticket turn
• false sharing:
• advance by stride slots per ticket
• futex:
• Fast Userspace muTEXes, userspace (no competition), kernel space (wait, wakeup)
• tbb::concurrent_bounded_queue
MPMC Queue
Service
• Client Dispatcher:
• SerialClientDispatcher: one request is allowed at a time
• PipelinedClientDispatcher: use a promises queue for pipelining
• Server Dispatcher:
• SerialServerDispatcher: one at a time synchronously
• PipelinedServerDispatcher: queued with a request id until they can be sent in order
• MultiplexServerDispatcher: dispatch as they come in
• Common Filter:
• ExpiringFilter: expires the service after a certain amount of time
• ExecutorFilter: through an executor
Overload Protection
• CoDel:
• Controlled Delay
• an active queue management algorithm
• attacking bufferbloat
• if every request has experienced queuing delay greater than the target (5ms)
during the past interval (100ms), then shed load
• slough off requests which have exceeded an alternate timeout (2 * target_delay)
• back to normal if delay down to 5ms
• application case: RabbitMQ
Connection Routing
class NaiveRoutingDataHandler : public … {
public:
bool parseRoutingData(IOBufQueue& bufQueue, RoutingData& routingData)
override {
auto buf = bufQueue.move();
buf->coalesce();
routingData.routingData = buf->data()[0];
routingData.bufQueue.append(buf);
return true;
}
};
ServerBootstrap<DefaultPipeline>
.pipeline(AcceptRoutingPipelineFactory(…));
Parallel Computing
vector<Future<int>> futures;
for (int channel = 0; channel < 10; ++channel) {
futures.emplace_back(makeFuture().then([channel] {
int sum = 0;
for (int i = 100 * channel; i < 100 * channel + 100; ++i) {
sum += i;
}
return sum;
}));
}
collectAll(futures.begin(), futures.end())
.then([](vector<Try<int>>&& parts) {
for (auto& part : parts) {
cout << part.value() << endl;
}
});
Parallel Computing
vector<Future<map<int, Entity>>> segments;
for (int segment = 0; segment < 10; ++segment) {
segments.emplace_back(makeFuture().then([] {
map<int, Entity> result;
// fill segment result
return result;
}));
}
Future<map<int, Entity>> entities = reduce(segments, {},
[](map<int, Entity> last, map<int, Entity> current) {
// merge current into last
});
Architecture
EventBase
• based on libevent::event_base
• NotificationQueue:
• producer-consumer
• passing messages between EventBase threads
• use an eventfd
• loop():
• before loop callbacks
• event_base_loop
• loop callbacks, busy
• time measurement
• run NotificationQueue events
SmoothLoopTime
• dynamically adjusting loop time
• EMA Algorithm (Exponential Moving Average)
• https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
2
lastbusy busy
idle idle
+
= +
_int _int
1 (1 )
idle idle
time erval time erval
i iEMA EMA e e busy
− −
−= × + − ×
Acceptor
• Acceptor IO Executor
• multi-IP (SO_REUSEADDR), multi-thread accept (SO_REUSEPORT)
• bind, listen, accept4 (max accept at once)
• connection event callback
• adjusting connection accept rate
• put accept info into a NotificationQueue
• build connection info via Connection IO Executor
• active accept pipeline (Acceptor) read
• fire child pipeline
Group
Server
Bootstrap
create
Server
WorkerPool
ServerAcceptor
Factory
IOExecutor
(io_group)
Server
Acceptor
create
addObserver
newAcceptor
forEachThread
threadStarted
create
Connection
Manager
create
Bind
Server
Bootstrap
IOExecutor
(accept_group)
AsyncServer
SocketFactory
Async
ServerSocket
newSocket
create
bind、listen
wait
addStartupFunction
Bind
Server
Bootstrap
forEacherWorker
Server
WorkerPool
EventBase
(acceptor_group)
AsyncServer
SocketFactory
runAddAcceptCB
InEventBase
addAcceptCallback
Async
ServerSocket
addAcceptCallabck
Remote
Acceptor
create
EventBase
(io_group)
runStartConsuming
InEventBase
initEventfd
NotificationQueue
(AsyncServerSocket)
Server
EventHandler
registerAcceptHandler
addAcceptCallback
register
EventHandler
addEventCallback
Accept
EventBase
(accept_group)
handlerReady
Server
EventHandler
Async
ServerSocket
handlerReady
accept4
connectionEventCallback
acceptRateAdjust
RemoteAcceptor
tryPutMessage
EventBase
(io_group)
signal
Connection
RemoteAcceptor
EventBase
(io_group)
ServerAcceptor
mesageAvailable
connectionAccepted
AcceptPipeline
read
read
Server
Connection
init
Connection
Pipeline
transportActive
Connection
Procedure
Pipeline
• HandlerContext:
• transmit events between handlers
• In/OutboundLink:
• link handlers together in order
• call handler to handle events
• PipelineContext:
• derived from HandlerContext and In/OutboundLink
• directions: In, Out, Both
• Pipeline<In, Out>:
• HandlerContext: wrap Handler
• chain:
• event (like read) --> PipelineContext (as In/OutboundLink)::read -->Handler::read -->
PipelineContext (as HandlerContext)::fireRead -->NextHandler::read --> …
Pipeline
<<接口>>
HandlerBase<Context>
-attachPipeline
-detachPipeline
<<接口>>
HandlerContext<In,Out>
-fireRead
-fireReadEOF
-fireReadException
-fireTransportActive
-fireTransportInactive
-fireWrite
-fireWriteException
-fireClose
<<接口>>
InboundHandlerContext<In>
-fireRead
-fireReadEOF
-fireReadException
-fireTransportActive
-fireTransportInactive
<<接口>>
OutboundHandlerContext<Out>
-fireWrite
-fireWriteException
-fireClose
<<接口>>
Handler<RIn,ROut,WIn,WOut>
-read
-readEOF
-readException
-transportActive
-transportInactive
-write
-writeException
-close
<<接口>>
InboundHandler<RIn,ROut,WIn,WOut>
-read
-readEOF
-readException
-transportActive
-transportInactive
<<接口>>
OutboundHandler<RIn,ROut,WIn,WOut>
-write
-writeException
-close
<<类>>
HandlerAdapter<RIn,ROut,WIn,WOut>
<<类>>
PipelineBase
<<类>>
Pipeline<In,Out>
-read
-readEOF
-readException
-transportActive
-transportInactive
-write
-writeException
-close
<<接口>>
PipelineContext
-attachPipeline
-detachPipeline
<<接口>>
InboundLink<In>
-read
-readEOF
-readException
-transportActive
-transportInactive
<<接口>>
OutboundLink<Out>
-write
-writeException
-close
-setNextOut
-setNextIn
<<类>>
ContextImplBase<Handler,Context>
<<类>>
ContextImpl<Handler>
<<类>>
InboundContextImpl<Handler>
<<类>>
OutboundContextImpl<Handler>
Pipeline
events
Pipeline
Context
Handler
read
read
fireRead
NextHandler
read
NextHandler
fireRead
read
Futures
• f.via(e).then(a).then(b)
• via:
• set executor
• then:
• make a new future/promise pair
• set callback:
• function result will be set in the new promise
• return its future
Core
• shared state object for Future and Promise
• reference count: Future, Promise, Executor
• callback and result
• activated by Future Destructor
• Finite State Machine:
• Try:
• value and exception
Chained Future
Future<R> then(Func func) {
Promise<R> p;
Future<R> f = p.getFuture();
setCallback([func, p](Try t) {
if (t.hasException) {
p.setException(t.exception);
} else {
p.setWith([&]() { return func(t.get()); });
}
});
return f;
}
Chained Future
Future<vector<string>> f = makeFuture<int>(3)
.then([](int i) {
return to_string(i);
})
.then([](string s) {
return vector<string>(s, 10);
});
Chained Future
Future<R> onError(Func func) {
Promise<R> p;
Future<R> f = p.getFuture();
setCallback([func, p](Try t) {
if (!t.withException([](Exp e) {
p.setWith([&] { return func(e); });
})) {
p.setTry(t);
}
}
return f;
}
Summary
Proxygen
• Facebook's C++ HTTP Libraries
• comprises the core C++ HTTP abstractions used at Facebook
Netty
Reference
• https://github.com/facebook/wangle
• https://github.com/facebook/folly
• https://github.com/facebook/proxygen
• http://twitter.github.io/finagle
• http://netty.io
Thank you

More Related Content

What's hot

Netty from the trenches
Netty from the trenchesNetty from the trenches
Netty from the trenchesJordi Gerona
 
JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011Kris Mok
 
Treasure Data Summer Internship 2016
Treasure Data Summer Internship 2016Treasure Data Summer Internship 2016
Treasure Data Summer Internship 2016Yuta Iwama
 
JVM Garbage Collection Tuning
JVM Garbage Collection TuningJVM Garbage Collection Tuning
JVM Garbage Collection Tuningihji
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaFrank Lyaruu
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itAlexey Fyodorov
 
Grand Central Dispatch Design Patterns
Grand Central Dispatch Design PatternsGrand Central Dispatch Design Patterns
Grand Central Dispatch Design PatternsRobert Brown
 
How to Test Asynchronous Code (v2)
How to Test Asynchronous Code (v2)How to Test Asynchronous Code (v2)
How to Test Asynchronous Code (v2)Felix Geisendörfer
 
Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Yoshifumi Kawai
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴명신 김
 
06 - Qt Communication
06 - Qt Communication06 - Qt Communication
06 - Qt CommunicationAndreas Jakl
 
Bucks County Tech Meetup: node.js introduction
Bucks County Tech Meetup: node.js introductionBucks County Tech Meetup: node.js introduction
Bucks County Tech Meetup: node.js introductiondshkolnikov
 
Introduction of failsafe
Introduction of failsafeIntroduction of failsafe
Introduction of failsafeSunghyouk Bae
 
iOS Multithreading
iOS MultithreadingiOS Multithreading
iOS MultithreadingRicha Jain
 
Comet with node.js and V8
Comet with node.js and V8Comet with node.js and V8
Comet with node.js and V8amix3k
 
The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018Charles Nutter
 

What's hot (20)

Netty from the trenches
Netty from the trenchesNetty from the trenches
Netty from the trenches
 
JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011
 
Treasure Data Summer Internship 2016
Treasure Data Summer Internship 2016Treasure Data Summer Internship 2016
Treasure Data Summer Internship 2016
 
JVM Garbage Collection Tuning
JVM Garbage Collection TuningJVM Garbage Collection Tuning
JVM Garbage Collection Tuning
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
 
Grand Central Dispatch Design Patterns
Grand Central Dispatch Design PatternsGrand Central Dispatch Design Patterns
Grand Central Dispatch Design Patterns
 
Apache Zookeeper
Apache ZookeeperApache Zookeeper
Apache Zookeeper
 
GCD and OperationQueue.
GCD and OperationQueue.GCD and OperationQueue.
GCD and OperationQueue.
 
How to Test Asynchronous Code (v2)
How to Test Asynchronous Code (v2)How to Test Asynchronous Code (v2)
How to Test Asynchronous Code (v2)
 
Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
Loom and concurrency latest
Loom and concurrency latestLoom and concurrency latest
Loom and concurrency latest
 
06 - Qt Communication
06 - Qt Communication06 - Qt Communication
06 - Qt Communication
 
Bucks County Tech Meetup: node.js introduction
Bucks County Tech Meetup: node.js introductionBucks County Tech Meetup: node.js introduction
Bucks County Tech Meetup: node.js introduction
 
Introduction of failsafe
Introduction of failsafeIntroduction of failsafe
Introduction of failsafe
 
iOS Multithreading
iOS MultithreadingiOS Multithreading
iOS Multithreading
 
Comet with node.js and V8
Comet with node.js and V8Comet with node.js and V8
Comet with node.js and V8
 
04 - Qt Data
04 - Qt Data04 - Qt Data
04 - Qt Data
 
The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018
 

Similar to Facebook C++网络库Wangle调研

Sharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's FinagleSharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's FinagleGeoff Ballinger
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaRick Warren
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleSaúl Ibarra Corretgé
 
Introduction tomcat7 servlet3
Introduction tomcat7 servlet3Introduction tomcat7 servlet3
Introduction tomcat7 servlet3JavaEE Trainers
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScriptQiangning Hong
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomyDongmin Yu
 
Flux and InfluxDB 2.0 by Paul Dix
Flux and InfluxDB 2.0 by Paul DixFlux and InfluxDB 2.0 by Paul Dix
Flux and InfluxDB 2.0 by Paul DixInfluxData
 
Writing Asynchronous Programs with Scala & Akka
Writing Asynchronous Programs with Scala & AkkaWriting Asynchronous Programs with Scala & Akka
Writing Asynchronous Programs with Scala & AkkaYardena Meymann
 
Finagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestFinagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestPavan Chitumalla
 
What you need to know for postgresql operation
What you need to know for postgresql operationWhat you need to know for postgresql operation
What you need to know for postgresql operationAnton Bushmelev
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Fwdays
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsOhad Kravchick
 
Fork and join framework
Fork and join frameworkFork and join framework
Fork and join frameworkMinh Tran
 
Automating Research Data with Globus Flows and Compute
Automating Research Data with Globus Flows and ComputeAutomating Research Data with Globus Flows and Compute
Automating Research Data with Globus Flows and ComputeGlobus
 

Similar to Facebook C++网络库Wangle调研 (20)

Python, do you even async?
Python, do you even async?Python, do you even async?
Python, do you even async?
 
Sharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's FinagleSharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's Finagle
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio module
 
Introduction tomcat7 servlet3
Introduction tomcat7 servlet3Introduction tomcat7 servlet3
Introduction tomcat7 servlet3
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
 
Server Side Swift: Vapor
Server Side Swift: VaporServer Side Swift: Vapor
Server Side Swift: Vapor
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
Servlets
ServletsServlets
Servlets
 
Flux and InfluxDB 2.0 by Paul Dix
Flux and InfluxDB 2.0 by Paul DixFlux and InfluxDB 2.0 by Paul Dix
Flux and InfluxDB 2.0 by Paul Dix
 
Data Pipeline at Tapad
Data Pipeline at TapadData Pipeline at Tapad
Data Pipeline at Tapad
 
Writing Asynchronous Programs with Scala & Akka
Writing Asynchronous Programs with Scala & AkkaWriting Asynchronous Programs with Scala & Akka
Writing Asynchronous Programs with Scala & Akka
 
Finagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestFinagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at Pinterest
 
What you need to know for postgresql operation
What you need to know for postgresql operationWhat you need to know for postgresql operation
What you need to know for postgresql operation
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"Anton Moldovan "Load testing which you always wanted"
Anton Moldovan "Load testing which you always wanted"
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js Applications
 
Fork and join framework
Fork and join frameworkFork and join framework
Fork and join framework
 
Automating Research Data with Globus Flows and Compute
Automating Research Data with Globus Flows and ComputeAutomating Research Data with Globus Flows and Compute
Automating Research Data with Globus Flows and Compute
 
Aimaf
AimafAimaf
Aimaf
 

Recently uploaded

SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dashnarutouzumaki53779
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 

Recently uploaded (20)

SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dash
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 

Facebook C++网络库Wangle调研