1701 lines
101 KiB
HTML
1701 lines
101 KiB
HTML
<!DOCTYPE html>
|
||
|
||
|
||
|
||
|
||
<html lang="en">
|
||
<head>
|
||
<meta name="pageKey" content="d_lithograph_content">
|
||
<!----><!----><!----> <meta name="locale" content="en_US">
|
||
<!----> <meta id="config" data-app-id="lithograph" data-app-version="0.0.2138" data-call-tree-id="AAZbLIrJ9sbq59BOvsFF9A==" data-multiproduct-name="lithograph-publish-frontend" data-service-name="lithograph-publish-frontend" data-browser-id="97df5ef0-795f-4b96-8c55-991ed7896aec" data-is-bot="false" data-page-instance="urn:li:page:d_lithograph_content;lpcSB+l/Sl6yxCM6nKJB2w==" data-disable-jsbeacon-pagekey-suffix="false" data-dna-member-lix-treatment="control" data-human-member-lix-treatment="control" data-dfp-member-lix-treatment="control" data-sync-apfc-headers-lix-treatment="control" data-sync-apfc-cb-lix-treatment="control" data-recaptcha-v3-integration-lix-value="control" data-network-interceptor-lix-value="control" data-is-epd-audit-event-enabled="false" data-is-feed-sponsored-tracking-kill-switch-enabled="false" data-sequence-auto-redirect-before-request-enabled="true">
|
||
|
||
<link rel="canonical" href="https://www.linkedin.com/blog/engineering/product-design/now-you-see-me-now-you-dont-linkedins-real-time-presence-platf">
|
||
<!----><!---->
|
||
<!---->
|
||
<!---->
|
||
<!---->
|
||
<!---->
|
||
<link rel="icon" href="https://static.licdn.com/aero-v1/sc/h/al2o9zrvru7aqj8e1x2rzsrca">
|
||
|
||
|
||
<script>
|
||
function getDfd() {let yFn,nFn;const p=new Promise(function(y, n){yFn=y;nFn=n;});p.resolve=yFn;p.reject=nFn;return p;}
|
||
window.lazyloader = getDfd();
|
||
window.tracking = getDfd();
|
||
window.impressionTracking = getDfd();
|
||
window.ingraphTracking = getDfd();
|
||
window.appDetection = getDfd();
|
||
window.pemTracking = getDfd();
|
||
window.appRedirectCompleted = getDfd();
|
||
</script>
|
||
|
||
<!---->
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
|
||
<title>Now You See Me, Now You Don’t: LinkedIn’s Real-Time Presence Platform</title>
|
||
<!---->
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:title" content="Now You See Me, Now You Don’t: LinkedIn’s Real-Time Presence Platform">
|
||
<!---->
|
||
<meta property="og:url" content="https://www.linkedin.com/blog/engineering/product-design/now-you-see-me-now-you-dont-linkedins-real-time-presence-platf">
|
||
<meta property="og:image" content="https://media.licdn.com/dms/image/v2/D4D08AQGLRX77SAlDfg/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688656487?e=2147483647&v=beta&t=_n3IEzs1Fhs7bDpb3U-A9wcHbJwryyR59J2RlII6zQI">
|
||
<meta name="twitter:title" content="Now You See Me, Now You Don’t: LinkedIn’s Real-Time Presence Platform">
|
||
<meta name="twitter:site" content="@linkedin">
|
||
<!---->
|
||
<!---->
|
||
<meta name="robots" content="noarchive">
|
||
|
||
<meta name="linkedin:pageTag" content="/blog/engineering/product-design/now-you-see-me-now-you-dont-linkedins-real-time-presence-platf">
|
||
<meta name="litmsProfileName" content="lithograph">
|
||
|
||
|
||
|
||
<!----> <meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<meta name="asset-url" id="artdeco/static/images/icons.svg" content="https://static.licdn.com/aero-v1/sc/h/6sz1e821vgereyxaakx87tt4z ">
|
||
<link rel="stylesheet" href="https://static.licdn.com/aero-v1/sc/h/lbz6744ddd0wsc02ey2a3dhx">
|
||
<!---->
|
||
|
||
<!----> </head>
|
||
<body dir="ltr">
|
||
<!---->
|
||
|
||
|
||
|
||
<a href="#lithograph-app" class="skip-link btn-md btn-primary absolute z-11 -top-[100vh] focus:top-0">
|
||
Skip to main content
|
||
</a>
|
||
|
||
<!---->
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="page-header__wrapper page-header__wrapper--margin" data-custom-nav-wrapper="true">
|
||
<div class="page-header__container">
|
||
<header id="page-header" class="page-header page-header--hide-dropshadow">
|
||
<div class="page-header__content-container">
|
||
<div class="header__logo">
|
||
<a href="https://www.linkedin.com/blog/engineering" class="custom-nav__logo-link">
|
||
<img class="header__linkedin-logo header__full-logo" src="https://static.licdn.com/aero-v1/sc/h/6zm111mce7vohqze950ilreo4" alt="LinkedIn Logo">
|
||
<img class="header__linkedin-logo header__in-bug" src="https://static.licdn.com/aero-v1/sc/h/5g0hjlcng3j5pgn50n2et1ca2" alt="LinkedIn Logo">
|
||
<span class="t-17 t-black t-bold default-header-title">
|
||
Engineering Blog
|
||
</span>
|
||
</a>
|
||
</div>
|
||
|
||
<!---->
|
||
<!---->
|
||
<button class="stripped header__expand-nav-button" data-mobile-header-navigation-button data-header-expand-navigation-button aria-expanded="false">
|
||
<li-icon class="header__expand-nav-icon" a11y-text="Open navigation" type="hamburger-icon"></li-icon>
|
||
</button>
|
||
<button class="stripped header__expand-nav-button hidden" data-mobile-header-navigation-button data-header-collapse-navigation-button aria-expanded="false">
|
||
<li-icon class="header__expand-nav-icon" a11y-text="Close navigation" type="cancel-icon"></li-icon>
|
||
</button>
|
||
</div>
|
||
</header>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<nav class="header-nav fixed" aria-label="main" data-header-navigation>
|
||
<ul class="header-nav__list">
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/data" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Data
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Data" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Graph System</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/economic-graph" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Economic Graph</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/skills-graph" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Skills Graph</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/knowledge" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Knowledge Graph</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-management" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Management</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-streaming-processing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Streams/Processing</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-science" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Science</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/research" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Research</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/ab-testing-experimentation" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">A/B Testing/Experimentation</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/artificial-intelligence" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
AI
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for AI" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/machine-learning" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Machine Learning</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/natural-language-processing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Natural Language Processing</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/generative-ai" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Generative AI</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/data-modeling" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Data Modeling</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/responsible-ai" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Responsible AI</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/trust-and-safety" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Trust & Safety
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Trust &amp; Safety" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/fairness" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Fairness</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/verification" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Verification </a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/security" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Security</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/product-design" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Product Design
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Product Design" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/marketing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Marketing </a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/sales" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Sales</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/learning" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Learning</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/hiring" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Hiring</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Profile</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/messaging-notifications" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Messaging/Notifications</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/feed" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Feed</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Profile</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/groups" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Groups</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/accessibility" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Accessibility</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/member-customer-experience" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Member/Customer Experience</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/search" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Search</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/recommendations" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Recommendations</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/skills" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Skills</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/infrastructure" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Infrastructure
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Infrastructure" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/code" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Code</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/scalability" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Scalability</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/distributed-systems" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Distributed Systems</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Graph Systems</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/architecture" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Architecture</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/analytics" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Analytics</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/automation" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Automation</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/platform-platformization" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Platforms/Platformization</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/cloud-computing" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Cloud Computing</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/open-source" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Open Source</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/additional-innovations" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Additional Innovations</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
|
||
|
||
<div class="artdeco-dropdown">
|
||
<div class="artdeco-dropdown__trigger">
|
||
<a href="https://www.linkedin.com/blog/engineering/talent" class="t-sans t-black--light t-semibold header-nav__toplink" target="_self">
|
||
Talent
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Talent" aria-expanded="false" data-trigger-dropdown-menu type="button">
|
||
<li-icon size="small" type="caret-filled-down-icon"></li-icon>
|
||
</button>
|
||
|
||
|
||
<div class="artdeco-dropdown__content header-nav__dropdown-offset">
|
||
<ul>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/culture" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Culture</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/developer-experience-productivity" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Developer Experience/Productivity</a>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<div class="artdeco-dropdown__item">
|
||
<a href="https://www.linkedin.com/blog/engineering/leadership" class="t-14 t-sans t-black t-bold header-nav__link" target="_self">Leadership</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
|
||
|
||
|
||
|
||
|
||
<nav class="custom-header__nav--mobile invisible" data-mobile-navigation="true" aria-label="main">
|
||
|
||
<ul class="custom-header__list--mobile">
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/data" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Data
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Data" aria-expanded="false" data-label-expand="Expand to show more links for Data" data-label-collapse="Collapse to show less links for Data" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-sans t-black t-normal header-nav__link" target="_self">Graph System</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/economic-graph" class="t-sans t-black t-normal header-nav__link" target="_self">Economic Graph</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/skills-graph" class="t-sans t-black t-normal header-nav__link" target="_self">Skills Graph</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/knowledge" class="t-sans t-black t-normal header-nav__link" target="_self">Knowledge Graph</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-management" class="t-sans t-black t-normal header-nav__link" target="_self">Data Management</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-streaming-processing" class="t-sans t-black t-normal header-nav__link" target="_self">Data Streams/Processing</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-science" class="t-sans t-black t-normal header-nav__link" target="_self">Data Science</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/research" class="t-sans t-black t-normal header-nav__link" target="_self">Research</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/ab-testing-experimentation" class="t-sans t-black t-normal header-nav__link" target="_self">A/B Testing/Experimentation</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/artificial-intelligence" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
AI
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for AI" aria-expanded="false" data-label-expand="Expand to show more links for AI" data-label-collapse="Collapse to show less links for AI" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/machine-learning" class="t-sans t-black t-normal header-nav__link" target="_self">Machine Learning</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/natural-language-processing" class="t-sans t-black t-normal header-nav__link" target="_self">Natural Language Processing</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/generative-ai" class="t-sans t-black t-normal header-nav__link" target="_self">Generative AI</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/data-modeling" class="t-sans t-black t-normal header-nav__link" target="_self">Data Modeling</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/responsible-ai" class="t-sans t-black t-normal header-nav__link" target="_self">Responsible AI</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/trust-and-safety" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Trust & Safety
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Trust &amp; Safety" aria-expanded="false" data-label-expand="Expand to show more links for Trust &amp; Safety" data-label-collapse="Collapse to show less links for Trust &amp; Safety" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/fairness" class="t-sans t-black t-normal header-nav__link" target="_self">Fairness</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/verification" class="t-sans t-black t-normal header-nav__link" target="_self">Verification </a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/security" class="t-sans t-black t-normal header-nav__link" target="_self">Security</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/product-design" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Product Design
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Product Design" aria-expanded="false" data-label-expand="Expand to show more links for Product Design" data-label-collapse="Collapse to show less links for Product Design" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/marketing" class="t-sans t-black t-normal header-nav__link" target="_self">Marketing </a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/sales" class="t-sans t-black t-normal header-nav__link" target="_self">Sales</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/learning" class="t-sans t-black t-normal header-nav__link" target="_self">Learning</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/hiring" class="t-sans t-black t-normal header-nav__link" target="_self">Hiring</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-sans t-black t-normal header-nav__link" target="_self">Profile</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/messaging-notifications" class="t-sans t-black t-normal header-nav__link" target="_self">Messaging/Notifications</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/feed" class="t-sans t-black t-normal header-nav__link" target="_self">Feed</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/profile" class="t-sans t-black t-normal header-nav__link" target="_self">Profile</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/groups" class="t-sans t-black t-normal header-nav__link" target="_self">Groups</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/accessibility" class="t-sans t-black t-normal header-nav__link" target="_self">Accessibility</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/member-customer-experience" class="t-sans t-black t-normal header-nav__link" target="_self">Member/Customer Experience</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/search" class="t-sans t-black t-normal header-nav__link" target="_self">Search</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/recommendations" class="t-sans t-black t-normal header-nav__link" target="_self">Recommendations</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/skills" class="t-sans t-black t-normal header-nav__link" target="_self">Skills</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/infrastructure" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Infrastructure
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Infrastructure" aria-expanded="false" data-label-expand="Expand to show more links for Infrastructure" data-label-collapse="Collapse to show less links for Infrastructure" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/code" class="t-sans t-black t-normal header-nav__link" target="_self">Code</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/scalability" class="t-sans t-black t-normal header-nav__link" target="_self">Scalability</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/distributed-systems" class="t-sans t-black t-normal header-nav__link" target="_self">Distributed Systems</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/graph-systems" class="t-sans t-black t-normal header-nav__link" target="_self">Graph Systems</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/architecture" class="t-sans t-black t-normal header-nav__link" target="_self">Architecture</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/analytics" class="t-sans t-black t-normal header-nav__link" target="_self">Analytics</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/automation" class="t-sans t-black t-normal header-nav__link" target="_self">Automation</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/platform-platformization" class="t-sans t-black t-normal header-nav__link" target="_self">Platforms/Platformization</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/cloud-computing" class="t-sans t-black t-normal header-nav__link" target="_self">Cloud Computing</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/open-source" class="t-sans t-black t-normal header-nav__link" target="_self">Open Source</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/additional-innovations" class="t-sans t-black t-normal header-nav__link" target="_self">Additional Innovations</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
<li class="custom-header__list-item--mobile" data-mobile-navigation-list-item="true">
|
||
|
||
|
||
|
||
|
||
<a href="https://www.linkedin.com/blog/engineering/talent" class="t-16 t-sans t-black t-semibold header-nav__toplink" target="_self">
|
||
Talent
|
||
</a>
|
||
|
||
<button class="header-navigation__button" aria-label="Expand to show more links for Talent" aria-expanded="false" data-label-expand="Expand to show more links for Talent" data-label-collapse="Collapse to show less links for Talent" data-mobile-dropdown-trigger type="button">
|
||
<li-icon size="small" type="chevron-down-icon"></li-icon>
|
||
</button>
|
||
|
||
<ul class="custom-header__dropdownlink-list--mobile hidden" data-dropdownlinks-list="true">
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/culture" class="t-sans t-black t-normal header-nav__link" target="_self">Culture</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/developer-experience-productivity" class="t-sans t-black t-normal header-nav__link" target="_self">Developer Experience/Productivity</a>
|
||
</li>
|
||
<li>
|
||
<a href="https://www.linkedin.com/blog/engineering/leadership" class="t-sans t-black t-normal header-nav__link" target="_self">Leadership</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
<div class="custom-header__button-share-container--mobile">
|
||
<!---->
|
||
</div>
|
||
</nav>
|
||
|
||
</div>
|
||
|
||
|
||
<main role="main">
|
||
|
||
<div id="lithograph-app">
|
||
|
||
|
||
<section id="component-container" data-attach-collapse-behavior="true">
|
||
|
||
|
||
<div id class="component component-articleHeadline" data-component-type="articleHeadline">
|
||
|
||
|
||
|
||
|
||
<div class="article-headline-container">
|
||
<p class="article-headline__topic">
|
||
<a class="t-14" href="https://www.linkedin.com/blog/engineering/product-design">Product Design</a>
|
||
</p>
|
||
|
||
<h1 class="article-headline t-40" data-article-title="Now You See Me, Now You Don’t: LinkedIn’s Real-Time Presence Platform">Now You See Me, Now You Don’t: LinkedIn’s Real-Time Presence Platform</h1>
|
||
<div class="article-meta t-14 article-meta__hairline">
|
||
<div class="article-meta__byline-container">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="author-profile__author-container">
|
||
<img class="author-profile__author-image" srcset="https://media.licdn.com/dms/image/v2/C4D03AQFnxdBRc7Vw3w/profile-displayphoto-shrink_100_100/profile-displayphoto-shrink_100_100/0/1532528076152?e=2147483647&v=beta&t=YjPBdIpQtPrHTDcqz0vBG5F4pKfdsDpXokVBOTVQ1V0 100w,https://media.licdn.com/dms/image/v2/C4D03AQFnxdBRc7Vw3w/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1532528076312?e=2147483647&v=beta&t=sBMkIeOlqBGs0Y_diOsc0zPmCyYqZSG1i0TDPfL-KR0 200w,https://media.licdn.com/dms/image/v2/C4D03AQFnxdBRc7Vw3w/profile-displayphoto-shrink_400_400/profile-displayphoto-shrink_400_400/0/1532528076373?e=2147483647&v=beta&t=poa_MZy_UYLHTsR754QGY_sWVOTMTky-O8jG2xjW6RY 400w,https://media.licdn.com/dms/image/v2/C4D03AQFnxdBRc7Vw3w/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1532528076136?e=2147483647&v=beta&t=fMZB69CmcSmQKN-Uvu_SvOfxZ5lDmWo8XKFqbvoqaRc 779w," sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" src="https://media.licdn.com/dms/image/v2/C4D03AQFnxdBRc7Vw3w/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1532528076136?e=2147483647&v=beta&t=fMZB69CmcSmQKN-Uvu_SvOfxZ5lDmWo8XKFqbvoqaRc" alt="Akhilesh Gupta">
|
||
<div class="author-profile__author-text-container">
|
||
<a href="https://www.linkedin.com/in/guptaakhilesh" target="_blank" class="t-14 t-bold"><span class="screen-reader">Authored by</span>Akhilesh Gupta</a>
|
||
<p class="t-14">Making LinkedIn ⚡️ fast!</p>
|
||
|
||
<p class="t-14 t-black--light" data-published-date="2018-1-12">
|
||
January 12, 2018
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<!---->
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="social-share">
|
||
<ul class="social-share__list share-list" title="Share via" data-share-list>
|
||
|
||
|
||
<li class="share-list__item share-item">
|
||
<a href="#" class="share-item__link medium-round-muted-tertiary-button" role="button" data-tracking-control-name="_linkedin_share" data-share-type="linkedin" aria-label="Share on LinkedIn, New window will open">
|
||
<li-icon class="share-item__icon" type="linkedin-icon"></li-icon>
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="share-list__item share-item">
|
||
<a href="#" class="share-item__link medium-round-muted-tertiary-button" role="button" data-tracking-control-name="_facebook_share" data-share-type="facebook" aria-label="Share on Facebook, New window will open">
|
||
<li-icon class="share-item__icon" type="facebook-icon"></li-icon>
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="share-list__item share-item">
|
||
<a href="#" class="share-item__link medium-round-muted-tertiary-button" role="button" data-tracking-control-name="_twitter_share" data-share-type="twitter" aria-label="Share on X, New window will open">
|
||
<svg class="share-item__icon share-item__icon--twitter" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" focusable="false" aria-hidden="true" role="none">
|
||
<path d="M13.9 10.47L21.35 2h-1.76l-6.46 7.35L7.96 2H2l7.81 11.12L2 22h1.76l6.83-7.77L16.04 22H22l-8.1-11.53zm-2.42 2.75l-.79-1.11L4.4 3.3h2.71l5.08 7.11.79 1.11 6.6 9.24h-2.71l-5.39-7.54z"></path>
|
||
</svg>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p><i>Co-authors: <a href="https://www.linkedin.com/in/guptaakhilesh/" target="_blank" data-tracking-control-name="_anchor_link">Akhilesh Gupta</a> and <a href="https://www.linkedin.com/in/menglay/" target="_blank" data-tracking-control-name="_anchor_link">Meng Lay</a></i></p>
|
||
<p> </p>
|
||
<p>Have you ever wondered how those green online indicators (or “presence indicators”) that are so pervasive in every instant messaging application and social network actually work? How does one display them in real time for roughly 500 million members on a social network like LinkedIn?</p>
|
||
<p>In this post, we’ll provide a technical walk-through of how we used the <a href="https://www.playframework.com/" target="_blank" data-tracking-control-name="_anchor_link">Play Framework</a> and the <a href="https://akka.io/" target="_blank" data-tracking-control-name="_anchor_link">Akka Actor Model</a> to build the massive infrastructure that keeps track of the <a href="https://blog.linkedin.com/2017/august/16/introducing-active-status-on-linkedin-messaging" target="_blank" data-tracking-control-name="_anchor_link">online status</a> of millions of members at any given moment. We’ll describe how it distributes thousands of changes per second in the online status of these members to millions of other connected members in real time. You will also learn how to apply these techniques to your own applications.</p>
|
||
<p>Let’s start with the first problem we needed to solve.</p>
|
||
<h2>Problem 1: How do we know when a member is connected to LinkedIn?</h2>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFsHilATFv9OA/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688656630?e=2147483647&v=beta&t=DrKjIIDW_07SCqv2if8wTRxNOmA0HY9XF0gIfuYvXFQ" alt="realtimepresence2">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>We needed to provide a way to access a member’s current online status, and if the member is offline, to provide their last active timestamp. Moreover, we needed a way to distribute changes in a member’s presence status to a potentially huge number of the member’s connections who could be currently viewing the member’s presence status anywhere on LinkedIn.</p>
|
||
<p>To solve this problem, we leveraged LinkedIn’s <a href="https://vimeo.com/239675704" target="_blank" data-tracking-control-name="_anchor_link">Real-time delivery platform</a> that we built last year for Instant Messaging on LinkedIn. The tech talk linked <a href="https://vimeo.com/239675704" target="_blank" data-tracking-control-name="_anchor_link">here</a> describes the platform in detail, but at a high level, it is a publish/subscribe system that allows data to be streamed from the server to mobile or web clients over a persistent connection as events happen.</p>
|
||
<p>When member “Alice” opens LinkedIn on her mobile device or a browser, a persistent connection is established with the Real-time Platform. The existence of this connection is a clear indication that Alice is currently online.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQGXWxp5un2n9w/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688656879?e=2147483647&v=beta&t=7U1kca6umX-eCmPs_MZgXWcZog7ZxP-ZcCUUKtofsjI" alt="realtimepresence3">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>Secondly, Alice may be interested in viewing whether Bob is currently online. For that, the Real-time Platform allows Alice to subscribe to a topic for Bob’s presence status.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQGq0-vcdKJAYA/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688656951?e=2147483647&v=beta&t=XqFd-OxRYfZARxtsKnaOsOhRE-keRzITSCKuqXDcpPc" alt="realtimepresence4">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>When Bob opens his app, we need our Presence Platform to know that Bob has come online and to publish an online event on the topic for Bob’s presence status. The Real-time Platform then sends the event published on that topic to all of its subscribers, including Alice. Thus, Alice would see Bob’s presence indicator turn green.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQERs_ll3yOIwA/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688657578?e=2147483647&v=beta&t=9Yqlk_Iab0zAsARAxI_-71McKPHJBrVEGk0W6bXVscU" alt="realtimepresence5">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>As you can see above, our Presence Platform needs to be able to detect the existence of the persistent connection to determine when a member comes online. Subsequently, it needs to publish events to the presence status topic for that member on the Real-time Platform. That would allow the Real-time Platform to distribute that event to the member’s connections. However, there is another big problem we need to solve.</p>
|
||
<h2>Problem 2: Jittery connections</h2>
|
||
<p>Members on mobile devices are often on lossy networks and regularly get disconnected and reconnected haphazardly. They could simply be on a bad network or experiencing temporary network interruption, such as passing through a tunnel or a parking garage.</p>
|
||
<p>If we ignored this problem, their presence status would constantly bounce between online and offline. Apart from it being a bad UI experience for the viewer, it would also result in a massive amount of avoidable traffic through our backend systems to distribute all these fluctuations in presence status to the connections of that member.</p>
|
||
<p>At this point, let’s dive into the architecture of LinkedIn’s Presence Platform to look at how we solved this problem using periodic heartbeats for currently connected members.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFjM4WfV-ggHw/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688657681?e=2147483647&v=beta&t=G9d73Y3rOu5e9WEJrCWexRVfrbjWCkWmPrTEDqcUIBo" alt="realtimepresence6">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>As we discussed before, when a member opens their LinkedIn application, it results in a persistent connection being established with the Real-time Platform. The Real-time Platform, in turn, starts emitting periodic heartbeats with the member’s ID with a fixed duration of d seconds between successive heartbeats. This duration acts as the guard against fluctuations in a member’s presence status. As long as a heartbeat is received every d seconds, our Presence Platform will deem the member to be online. Thus, if a member runs into a bad network condition, drops their connection and then reconnects within d seconds, we will continue to deem them as online, as long as the next heartbeat is emitted for their connection. This handles jitter gracefully and prevents unnecessary fluctuations. Next, let’s look at the internals of our Presence Platform to understand how each of these heartbeats are processed.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFY6Crd7mEVbg/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688658069?e=2147483647&v=beta&t=tpa_aDLd8zA6byw3eVfao99AhV3B-q02h8vhxmUxXyo" alt="realtimepresence7">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>The first part of the Presence Platform is the process heartbeats step.</p>
|
||
<ul>
|
||
<li><p>For each received heartbeat corresponding to a member ID, it checks whether we have an unexpired entry for that member ID in our distributed K/V store for Presence. Any distributed K/V store that can support both a high read and write volume can be used for this purpose.</p> </li>
|
||
<li><p>If there is no entry or if previous entries have expired,</p>
|
||
<ul>
|
||
<li><p>We conclude that the member just came online.</p> </li>
|
||
<li><p>We publish an online event on the presence status topic for that member on the Real-time Platform to distribute that event to the member’s connections.</p> </li>
|
||
<li><p>We add an entry to the store with an expiry duration which is slightly larger than d seconds (d + ε) to keep the record alive till at least the next heartbeat.</p> </li>
|
||
</ul> </li>
|
||
<li><p>If an unexpired entry exists, the member is already online and we simply update the lastHeartbeatTimestamp for that member ID to the latest value.</p> </li>
|
||
</ul>
|
||
<p>As you can see, processing heartbeats and detecting when a member goes online is straightforward with the above setup. This is where we hit our next problem: how do we detect when a member goes offline?</p>
|
||
<h2>Problem 3: Detecting the absence of a heartbeat</h2>
|
||
<p>To determine that a member went offline, we need to detect the absence of a heartbeat. For this, we built what we called a delayed trigger for each member that is currently online. We’ll talk about the technology we used to build this in the next section, but for now, assume that for each online member, we are able to start a timer that will fire later to allow us to check whether the heartbeat stored for that member has expired or not. Since heartbeats expire in d + ε seconds, we need the timer to fire a little after that or in d + 2ε seconds.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQF4T7kVp1nD1g/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688657420?e=2147483647&v=beta&t=G7G8cj6dPlhX5WCMEg_VJ4IBp40CTfO4jhZg1HU7mUw" alt="realtimepresence8">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>Thus, during the process heartbeat step, we create this delayed trigger if it doesn’t yet exist for the member. If it already exists, we simply reset it to fire in another d + 2ε seconds. When the delayed trigger for an online member fires, we check whether the member’s heartbeat has expired in our K/V store. If it has, we publish an offline event on the presence status topic for that member on the Real-time Platform to distribute the fact that the member has gone offline to the member’s connections.</p>
|
||
<p>You might be wondering how this scales out horizontally. Note that it doesn’t matter which node running the Presence Service receives a member’s heartbeat. The common state is kept only in the distributed K/V store, which will allow any node to do the exact same processing for a given member. However, to prevent duplication of the delayed triggers for a member on multiple nodes, we do a best-effort sticky routing of a given member’s heartbeats to a given node. This is done using the <a href="https://github.com/linkedin/rest.li/wiki/Dynamic-Discovery#d2-load-balancer" target="_blank" data-tracking-control-name="_anchor_link">d2 load balancer</a> at LinkedIn, which supports a load balancer strategy that can hash the member ID in the heartbeat request to route it to the same node.</p>
|
||
<p><b>Delayed triggers using Akka Actors<br> </b>On LinkedIn, thousands of members go online or offline per second. There are millions of members that are online at any given moment. Since we create a delayed trigger for each online member, we needed a truly lightweight solution.</p>
|
||
<p><a href="https://akka.io/" target="_blank" data-tracking-control-name="_anchor_link">Akka</a> is a toolkit for building highly concurrent, distributed, and resilient message-driven applications, and it works well with the <a href="https://www.playframework.com/" target="_blank" data-tracking-control-name="_anchor_link">Play Framework</a> that we use at LinkedIn. <a href="https://doc.akka.io/docs/akka/current/general/actors.html" target="_blank" data-tracking-control-name="_anchor_link">Actors</a> are objects which encapsulate state and the behavior defining what they should do when they receive certain messages. Each Actor has a mailbox and they communicate exclusively by exchanging messages. An Actor is assigned a lightweight thread when available, which reads the message from the mailbox and alters the state of the Actor based on the behavior defined for that message.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQHacT6q241QWA/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688657682?e=2147483647&v=beta&t=SECX8jQQMcg87taXaCncehY2QWdAdd6LFdiMFpn2O7M" alt="realtimepresence9">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>Since Actors are so lightweight, there can be millions of Actors in the system, each with their own state and behavior. A relatively small number of threads proportional to the number of cores on the system can serve the Actors to execute their behavior when they receive these messages. As each Actor receives a message, a thread is assigned to execute its behavior for that message and then, it is free to be assigned to the next Actor.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFWTTCJFl0pNw/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688658117?e=2147483647&v=beta&t=kFgzQVIQyZc8LYAmdY86APj7AKIkqeLCa6hjZzgcu7E" alt="realtimepresence10">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>We can basically create one Actor per online member to act as the delayed trigger for that member and treat a heartbeat like a message in its mailbox.</p>
|
||
<ul>
|
||
<li><p>When a Heartbeat message is received for a member, we create an Actor for the member if it doesn’t already exist and start an <a href="https://doc.akka.io/docs/akka/2.5.5/java/scheduler.html" target="_blank" data-tracking-control-name="_anchor_link">Akka Scheduler</a> within the Actor to send a Publish Offline message to itself after d + 2ε seconds.</p> </li>
|
||
<li><p>When the scheduler fires, the Actor handles the Publish Offline message by publishing an offline event if the member’s entry has expired in the K/V store, as described before.</p> </li>
|
||
</ul>
|
||
<p>Interestingly, the number of live Actors in the Presence Platform corresponds to the number of online members at that moment, and the duration for which these Actors are live corresponds to the duration for which LinkedIn members are online.</p>
|
||
<p>Since Actors reside in memory, we need to be careful to allow a graceful shutdown of live Actors on a node during deployment. We introduce a delay of d + 2ε seconds between marking a node for deployment and restarting the process to allow all the delayed triggers on that node to be drained.</p>
|
||
<p>A note on the value of d, the duration between consecutive heartbeats: If it’s too low, we would have to process a lot more heartbeats and, in general, we would have increased the load on our system. If it’s too high, it would take too much time to detect when a member goes offline. As with most other things in life, it needs to be a balance.</p>
|
||
<h2>Putting it all together</h2>
|
||
<p>Let’s briefly go back to Alice and Bob to put this all together.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFZMLDo2WTd9Q/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688658527?e=2147483647&v=beta&t=opD9VJjGzhXy3ODZvhdS2fjIwGXJe4zgxMHxedf5rmo" alt="realtimepresence11">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<ol>
|
||
<li><p>When Alice is interested in Bob’s presence status, she queries the Presence Platform through its GET API to get Bob’s current presence status (offline) and his last heartbeat timestamp. At the same time, she subscribes to changes in Bob’s presence status through the Real-time Platform.</p> </li>
|
||
<li><p>When Bob comes online, the Presence Platform detects that and publishes an online event to Bob’s presence status topic on the Real-time Platform.</p> </li>
|
||
<li><p>The Real-time Platform sends the change in Bob’s status to Alice and Alice can now see Bob as online. This process is really fast and it takes less than 200ms at p99.</p> </li>
|
||
</ol>
|
||
<p>This platform is built for massive scale. Each node in the Presence Platform can handle approximately 1.8K QPS of incoming requests (process heartbeat requests, GET API requests, etc.) and the platform itself is horizontally scalable as described above. Using all the above technology, we are now able to display real-time presence status for a member’s connections across LinkedIn messaging, feed, notifications, etc. on both mobile and web for hundreds of millions of LinkedIn members across the globe.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-standaloneImage" data-component-type="standaloneImage">
|
||
|
||
|
||
|
||
|
||
<div class="standalone-image-component standalone-image-component--article-width">
|
||
<figure>
|
||
<img class="standalone-image-component__image" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 1920px" data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFfR6g9F7Oqfw/croft-frontend-shrinkToFit1024/croft-frontend-shrinkToFit1024/0/1700688657725?e=2147483647&v=beta&t=80DMwaUd8jfq6hjTCn9IbIu7kjtJ-FECafpAD2r6cqY" alt="realtimepresence12">
|
||
<!----> </figure>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-migratedContent" data-component-type="migratedContent">
|
||
|
||
|
||
|
||
|
||
<div class="rich-text">
|
||
<p>This has made our LinkedIn experience come alive and we can visually interact with our friends and colleagues on things that matter to us the most. We have seen increased engagement across the site and received positive feedback from LinkedIn members since we launched this feature. We hope that this technical deep-dive inspires you to try these techniques in your own projects. Feel free to reach out to us to discuss your own ideas at <a href="https://twitter.com/agupta03" target="_blank" data-tracking-control-name="_anchor_link">@agupta03</a> and <a href="https://www.linkedin.com/in/menglay" target="_blank" data-tracking-control-name="_anchor_link">Meng Lay</a>. </p>
|
||
<h2>Acknowledgements</h2>
|
||
<p>It took an entire team of engineers, managers, designers, data scientists, and product managers to take this project from idea to release. We’d like thank the following people for their invaluable contributions to the project: <a href="https://www.linkedin.com/in/dejno/" target="_blank" data-tracking-control-name="_anchor_link">Jake Dejno</a>, <a href="https://www.linkedin.com/in/jiading/" target="_blank" data-tracking-control-name="_anchor_link">Jia Ding</a>, <a href="https://www.linkedin.com/in/jingwei-huang-b6731841/" target="_blank" data-tracking-control-name="_anchor_link">Jingwei Huang</a>, <a href="https://www.linkedin.com/in/seantherockjohnson/" target="_blank" data-tracking-control-name="_anchor_link">Sean Johnson</a>, <a href="https://www.linkedin.com/in/adam-leon-8847239/" target="_blank" data-tracking-control-name="_anchor_link">Adam Leon</a>, <a href="https://www.linkedin.com/in/hmajoros/" target="_blank" data-tracking-control-name="_anchor_link">Henry Majoros</a>, <a href="https://www.linkedin.com/in/haowen-ning-16393719/" target="_blank" data-tracking-control-name="_anchor_link">Haowen Ning</a>, <a href="https://www.linkedin.com/in/viet-nguyen-562a304/" target="_blank" data-tracking-control-name="_anchor_link">Viet Nguyen</a>, <a href="https://www.linkedin.com/in/f%C3%A9lix-pageau/" target="_blank" data-tracking-control-name="_anchor_link">Félix Pageau</a>, <a href="https://www.linkedin.com/in/amitruparel/" target="_blank" data-tracking-control-name="_anchor_link">Amit Ruparel</a>, <a href="https://www.linkedin.com/in/sammyshreibati/" target="_blank" data-tracking-control-name="_anchor_link">Sammy Shreibati</a>, <a href="https://www.linkedin.com/in/james-eric-sorenson/" target="_blank" data-tracking-control-name="_anchor_link">James Sorenson</a>, <a href="https://www.linkedin.com/in/szetopia/" target="_blank" data-tracking-control-name="_anchor_link">Chris Szeto</a>, <a href="https://www.linkedin.com/in/tajwelsh/" target="_blank" data-tracking-control-name="_anchor_link">Taj Welsh</a>, and <a href="https://www.linkedin.com/in/maxwolffe/" target="_blank" data-tracking-control-name="_anchor_link">Max Wolffe</a>.</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div id class="component component-postList" data-component-type="postList">
|
||
|
||
|
||
|
||
|
||
<section id="postList0FocusPoint" class="component__content-container list-layout" data-post-list>
|
||
<section class="simple-topic-list">
|
||
<p class="t-14 t-bold">Topics:
|
||
<a class="simple-topic-list__topic" href="https://www.linkedin.com/blog/engineering/architecture">
|
||
Architecture
|
||
</a>
|
||
<a class="simple-topic-list__topic" href="https://www.linkedin.com/blog/engineering/product-design">
|
||
Product Design
|
||
</a>
|
||
<a class="simple-topic-list__topic" href="https://www.linkedin.com/blog/engineering/infrastructure">
|
||
Infrastructure
|
||
</a>
|
||
</p>
|
||
</section>
|
||
|
||
<hr class="artdeco-divider">
|
||
|
||
<section class="list-layout__headline-container">
|
||
|
||
|
||
<p class="list-layout__headline t-32 t-sans">Related articles</p>
|
||
|
||
|
||
|
||
<!---->
|
||
</section>
|
||
|
||
<ul class="list-layout__posts">
|
||
|
||
|
||
<li class="post-list__item list-post">
|
||
<div class="list-post__content-container">
|
||
<p class="list-post__content-container__topic">
|
||
<a class="t-14 t-bold" href="https://www.linkedin.com/blog/engineering/infrastructure">
|
||
Infrastructure
|
||
</a>
|
||
</p>
|
||
|
||
<div class="list-post__content-container__title">
|
||
<a class="list-post__link t-20 t-black" href="https://www.linkedin.com/blog/engineering/infrastructure/the-training-infrastructure-behind-ai-powered-job-search-eight-x-faster-multi-teacher-distillation">
|
||
The Training Infrastructure Behind AI-Powered Job Search: 8X F...
|
||
</a>
|
||
</div>
|
||
|
||
<div class="list-post__content-container__byline">
|
||
<p class="list-post__content-container__author t-14 t-bold t-black">
|
||
Jaideep Ray
|
||
</p>
|
||
<!---->
|
||
<p class="list-post__content-container__date t-14 t-black--light">
|
||
Aug 6, 2026
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="list-post__image-container">
|
||
<figure class="post__image-figure">
|
||
|
||
|
||
<img class="post__image" alt data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQEctZ-EpMCamw/croft-frontend-shrinkToFit600/B4DZ_Ti6GaGYAQ-/0/1785960571979?e=2147483647&v=beta&t=gpPNPoM7OkjDl_PzMT4Tub1yA6bII-BPfO1uqIYeHRI" data-ghost-url="https://static.licdn.com/aero-v1/sc/h/8pouyb1ly746xtru0x7p2axm0" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 480px">
|
||
|
||
</figure>
|
||
</div>
|
||
</li>
|
||
|
||
|
||
|
||
<li class="post-list__item list-post">
|
||
<div class="list-post__content-container">
|
||
<p class="list-post__content-container__topic">
|
||
<a class="t-14 t-bold" href="https://www.linkedin.com/blog/engineering/ai">
|
||
AI
|
||
</a>
|
||
</p>
|
||
|
||
<div class="list-post__content-container__title">
|
||
<a class="list-post__link t-20 t-black" href="https://www.linkedin.com/blog/engineering/ai/qa-agent-reimagining-software-quality-with-ai-driven-autonomous-testing">
|
||
Quality Assurance Agent: Reimagining Software Quality with AI-...
|
||
</a>
|
||
</div>
|
||
|
||
<div class="list-post__content-container__byline">
|
||
<p class="list-post__content-container__author t-14 t-bold t-black">
|
||
Asa Kusuma
|
||
</p>
|
||
<!---->
|
||
<p class="list-post__content-container__date t-14 t-black--light">
|
||
Jun 18, 2026
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="list-post__image-container">
|
||
<figure class="post__image-figure">
|
||
|
||
|
||
<img class="post__image" alt data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQFWxUw04ihjYQ/croft-frontend-shrinkToFit600/B4DZ7bHNPnGkAQ-/0/1781792560756?e=2147483647&v=beta&t=KiyIbEztZVaRRSzY53ezbvpjY4EYCksSDoMR7R8--Rk" data-ghost-url="https://static.licdn.com/aero-v1/sc/h/8pouyb1ly746xtru0x7p2axm0" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 480px">
|
||
|
||
</figure>
|
||
</div>
|
||
</li>
|
||
|
||
|
||
|
||
<li class="post-list__item list-post">
|
||
<div class="list-post__content-container">
|
||
<!---->
|
||
<div class="list-post__content-container__title">
|
||
<a class="list-post__link t-20 t-black" href="https://www.linkedin.com/blog/engineering/infrastructure/faster-than-light-optimizing-generative-recommender-training-efficiency-at-linkedin">
|
||
Faster than Light: Optimizing Generative Recommender Training ...
|
||
</a>
|
||
</div>
|
||
|
||
<div class="list-post__content-container__byline">
|
||
<p class="list-post__content-container__author t-14 t-bold t-black">
|
||
Yitong Zhou
|
||
</p>
|
||
<!----><!----><!----><!----><!---->
|
||
<p class="list-post__content-container__date t-14 t-black--light">
|
||
May 28, 2026
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="list-post__image-container">
|
||
<figure class="post__image-figure">
|
||
|
||
|
||
<img class="post__image" alt data-delayed-url="https://media.licdn.com/dms/image/v2/D4D08AQF8sldepd_9KQ/croft-frontend-shrinkToFit1200/B4DZ5v8sMMKsAg-/0/1779994641420?e=2147483647&v=beta&t=QTrTmYC_08QGkiHzNXCv7C_c-gfVEF4NdLnG4nqgugk" data-ghost-url="https://static.licdn.com/aero-v1/sc/h/8pouyb1ly746xtru0x7p2axm0" sizes="(max-width: 480px) 480px, (max-width: 767px) 767px, (max-width: 1024px) 1024px, 480px">
|
||
|
||
</figure>
|
||
</div>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<!----> </section>
|
||
|
||
|
||
</div>
|
||
|
||
|
||
<!----> </section>
|
||
</div>
|
||
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/8hfbuq1ftcvnnx4dd5067pi0t" async></script>
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/bknx7jzs0ylu540sn4wuo6bue" async></script>
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/egqq1vs0784qd3h3801e2w9lr" async></script>
|
||
|
||
</main>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<footer class="li-footer bg-transparent w-full ">
|
||
<ul class="li-footer__list flex flex-wrap flex-row items-start justify-start w-full h-auto min-h-[50px] my-[0px] mx-auto py-3 px-2 papabear:p-0">
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
|
||
<span class="sr-only">LinkedIn</span>
|
||
<icon class="li-footer__copy-logo text-color-logo-brand-alt inline-block self-center h-[14px] w-[56px] mr-1" data-delayed-url="https://static.licdn.com/aero-v1/sc/h/5mebydpuuijm3uhv1q375inqh"></icon>
|
||
<span class="li-footer__copy-text flex items-center">© 2026</span>
|
||
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://about.linkedin.com?trk=content_footer-about" data-tracking-control-name="content_footer-about" data-tracking-will-navigate>
|
||
|
||
About
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/accessibility?trk=content_footer-accessibility" data-tracking-control-name="content_footer-accessibility" data-tracking-will-navigate>
|
||
|
||
Accessibility
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/user-agreement?trk=content_footer-user-agreement" data-tracking-control-name="content_footer-user-agreement" data-tracking-will-navigate>
|
||
|
||
User Agreement
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/privacy-policy?trk=content_footer-privacy-policy" data-tracking-control-name="content_footer-privacy-policy" data-tracking-will-navigate>
|
||
|
||
Privacy Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
<!---->
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/cookie-policy?trk=content_footer-cookie-policy" data-tracking-control-name="content_footer-cookie-policy" data-tracking-will-navigate>
|
||
|
||
Cookie Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/legal/copyright-policy?trk=content_footer-copyright-policy" data-tracking-control-name="content_footer-copyright-policy" data-tracking-will-navigate>
|
||
|
||
Copyright Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://brand.linkedin.com/policies?trk=content_footer-brand-policy" data-tracking-control-name="content_footer-brand-policy" data-tracking-will-navigate>
|
||
|
||
Brand Policy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/psettings/guest-controls?trk=content_footer-guest-controls" data-tracking-control-name="content_footer-guest-controls" data-tracking-will-navigate>
|
||
|
||
Guest Controls
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
<a class="li-footer__item-link flex items-center font-sans text-xs font-bold text-color-text-solid-secondary hover:text-color-link-hover focus:text-color-link-focus" href="https://www.linkedin.com/help/linkedin/answer/34593?trk=content_footer-community-guide" data-tracking-control-name="content_footer-community-guide" data-tracking-will-navigate>
|
||
|
||
Community Guidelines
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
<!---->
|
||
|
||
|
||
<li class="li-footer__item font-sans text-xs text-color-text-solid-secondary flex flex-shrink-0 justify-start p-1 relative w-50% papabear:justify-center papabear:w-auto">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="collapsible-dropdown collapsible-dropdown--footer collapsible-dropdown--up flex items-center relative hyphens-auto language-selector z-2">
|
||
<!---->
|
||
<ul class="collapsible-dropdown__list hidden container-raised absolute w-auto overflow-y-auto flex-col items-stretch z-[9999] bottom-[100%] top-auto" role="menu" tabindex="-1">
|
||
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="العربية (Arabic)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ar_AE" data-locale="ar_AE" role="menuitem" lang="ar_AE">
|
||
العربية (Arabic)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="বাংলা (Bangla)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-bn_IN" data-locale="bn_IN" role="menuitem" lang="bn_IN">
|
||
বাংলা (Bangla)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Čeština (Czech)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-cs_CZ" data-locale="cs_CZ" role="menuitem" lang="cs_CZ">
|
||
Čeština (Czech)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Dansk (Danish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-da_DK" data-locale="da_DK" role="menuitem" lang="da_DK">
|
||
Dansk (Danish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Deutsch (German)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-de_DE" data-locale="de_DE" role="menuitem" lang="de_DE">
|
||
Deutsch (German)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Ελληνικά (Greek)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-el_GR" data-locale="el_GR" role="menuitem" lang="el_GR">
|
||
Ελληνικά (Greek)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="English (English) selected" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link--selected" data-tracking-control-name="language-selector-en_US" data-locale="en_US" role="menuitem" lang="en_US">
|
||
<strong>English (English)</strong>
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Español (Spanish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-es_ES" data-locale="es_ES" role="menuitem" lang="es_ES">
|
||
Español (Spanish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="فارسی (Persian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-fa_IR" data-locale="fa_IR" role="menuitem" lang="fa_IR">
|
||
فارسی (Persian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Suomi (Finnish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-fi_FI" data-locale="fi_FI" role="menuitem" lang="fi_FI">
|
||
Suomi (Finnish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Français (French)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-fr_FR" data-locale="fr_FR" role="menuitem" lang="fr_FR">
|
||
Français (French)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="हिंदी (Hindi)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-hi_IN" data-locale="hi_IN" role="menuitem" lang="hi_IN">
|
||
हिंदी (Hindi)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Magyar (Hungarian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-hu_HU" data-locale="hu_HU" role="menuitem" lang="hu_HU">
|
||
Magyar (Hungarian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Bahasa Indonesia (Indonesian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-in_ID" data-locale="in_ID" role="menuitem" lang="in_ID">
|
||
Bahasa Indonesia (Indonesian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Italiano (Italian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-it_IT" data-locale="it_IT" role="menuitem" lang="it_IT">
|
||
Italiano (Italian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="עברית (Hebrew)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-iw_IL" data-locale="iw_IL" role="menuitem" lang="iw_IL">
|
||
עברית (Hebrew)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="日本語 (Japanese)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ja_JP" data-locale="ja_JP" role="menuitem" lang="ja_JP">
|
||
日本語 (Japanese)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="한국어 (Korean)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ko_KR" data-locale="ko_KR" role="menuitem" lang="ko_KR">
|
||
한국어 (Korean)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="मराठी (Marathi)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-mr_IN" data-locale="mr_IN" role="menuitem" lang="mr_IN">
|
||
मराठी (Marathi)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Bahasa Malaysia (Malay)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ms_MY" data-locale="ms_MY" role="menuitem" lang="ms_MY">
|
||
Bahasa Malaysia (Malay)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Nederlands (Dutch)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-nl_NL" data-locale="nl_NL" role="menuitem" lang="nl_NL">
|
||
Nederlands (Dutch)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Norsk (Norwegian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-no_NO" data-locale="no_NO" role="menuitem" lang="no_NO">
|
||
Norsk (Norwegian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="ਪੰਜਾਬੀ (Punjabi)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-pa_IN" data-locale="pa_IN" role="menuitem" lang="pa_IN">
|
||
ਪੰਜਾਬੀ (Punjabi)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Polski (Polish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-pl_PL" data-locale="pl_PL" role="menuitem" lang="pl_PL">
|
||
Polski (Polish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Português (Portuguese)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-pt_BR" data-locale="pt_BR" role="menuitem" lang="pt_BR">
|
||
Português (Portuguese)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Română (Romanian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ro_RO" data-locale="ro_RO" role="menuitem" lang="ro_RO">
|
||
Română (Romanian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Русский (Russian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-ru_RU" data-locale="ru_RU" role="menuitem" lang="ru_RU">
|
||
Русский (Russian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Svenska (Swedish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-sv_SE" data-locale="sv_SE" role="menuitem" lang="sv_SE">
|
||
Svenska (Swedish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="తెలుగు (Telugu)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-te_IN" data-locale="te_IN" role="menuitem" lang="te_IN">
|
||
తెలుగు (Telugu)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="ภาษาไทย (Thai)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-th_TH" data-locale="th_TH" role="menuitem" lang="th_TH">
|
||
ภาษาไทย (Thai)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Tagalog (Tagalog)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-tl_PH" data-locale="tl_PH" role="menuitem" lang="tl_PH">
|
||
Tagalog (Tagalog)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Türkçe (Turkish)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-tr_TR" data-locale="tr_TR" role="menuitem" lang="tr_TR">
|
||
Türkçe (Turkish)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Українська (Ukrainian)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-uk_UA" data-locale="uk_UA" role="menuitem" lang="uk_UA">
|
||
Українська (Ukrainian)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="Tiếng Việt (Vietnamese)" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-vi_VN" data-locale="vi_VN" role="menuitem" lang="vi_VN">
|
||
Tiếng Việt (Vietnamese)
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="简体中文 (Chinese (Simplified))" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-zh_CN" data-locale="zh_CN" role="menuitem" lang="zh_CN">
|
||
简体中文 (Chinese (Simplified))
|
||
</button>
|
||
</li>
|
||
<li class="language-selector__item" role="presentation">
|
||
<!-- Adding aria-label to both the li and the button because screen reader focus goes to button on desktop and li on mobile-->
|
||
<button aria-label="正體中文 (Chinese (Traditional))" class="font-sans text-xs link block py-[5px] px-2 w-full hover:cursor-pointer hover:bg-color-action hover:text-color-text-on-dark focus:bg-color-action focus:text-color-text-on-dark
|
||
language-selector__link !font-regular" data-tracking-control-name="language-selector-zh_TW" data-locale="zh_TW" role="menuitem" lang="zh_TW">
|
||
正體中文 (Chinese (Traditional))
|
||
</button>
|
||
</li>
|
||
<!---->
|
||
</ul>
|
||
|
||
|
||
<button class="language-selector__button select-none relative pr-2 font-sans text-xs font-bold text-color-text-low-emphasis hover:text-color-link-hover hover:cursor-pointer focus:text-color-link-focus focus:outline-dotted focus:outline-1" aria-expanded="false" data-tracking-control-name="footer-lang-dropdown_trigger">
|
||
<span class="language-selector__label-text mr-0.5 break-words">
|
||
Language
|
||
</span>
|
||
<icon class="language-selector__label-chevron w-2 h-2 absolute top-0 right-0" data-delayed-url="https://static.licdn.com/aero-v1/sc/h/cyolgscd0imw2ldqppkrb84vo"></icon>
|
||
</button>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<!----> </footer>
|
||
|
||
|
||
|
||
<script src="https://static.licdn.com/aero-v1/sc/h/e69gtg8c61dzqklxridy0htl9" async></script>
|
||
<!---->
|
||
|
||
<!----><!---->
|
||
</body>
|
||
</html>
|
||
|
||
|
||
|