| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| |
| <link rel="preconnect" href="https://www.googletagmanager.com"> |
| <script >(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': |
| new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], |
| j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= |
| 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); |
| })(window,document,'script','dataLayer','GTM-W8MVQXG');</script> |
| |
| <meta charset="utf-8"> |
| <meta name="description" content="Go is an open source programming language that makes it easy to build simple, reliable, and efficient software."> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="theme-color" content="#00add8"> |
| <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Google+Sans:400,500,600|Work+Sans:400,500,600|Roboto:400,500,700|Open+Sans:Source+Code+Pro|Material+Icons"> |
| <link rel="stylesheet" href="/css/styles.css"> |
| |
| <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': |
| new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], |
| j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= |
| 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); |
| })(window,document,'script','dataLayer','GTM-W8MVQXG');</script> |
| |
| <script src="/js/site.js"></script> |
| <title>How the Firebase Hosting Team Scaled With Go - go.dev</title> |
| </head> |
| <body class="Site"> |
| |
| <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W8MVQXG" |
| height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> |
| |
| <header class="Site-header js-siteHeader"> |
| <div class="Banner"> |
| <div class="Banner-inner"> |
| <div class="Banner-message">Black Lives Matter</div> |
| <a class="Banner-action" |
| href="https://support.eji.org/give/153413/#!/donation/checkout" |
| target="_blank" |
| rel="noopener"> |
| Support the Equal Justice Initiative |
| </a> |
| </div> |
| </div> |
| <div class="Header Header--dark"> |
| <nav class="Header-nav"> |
| <a href="https://go.dev/"> |
| <img |
| class="js-headerLogo Header-logo" |
| src="/images/go-logo-white.svg" |
| alt="Go"> |
| </a> |
| <div class="Header-rightContent"> |
| <ul class="Header-menu"> |
| <li class="Header-menuItem "> |
| <a href="/solutions/">Why Go</a> |
| </li> |
| <li class="Header-menuItem "> |
| <a href="/learn/">Getting Started</a> |
| </li> |
| <li class="Header-menuItem "> |
| <a href="https://pkg.go.dev">Discover Packages</a> |
| </li> |
| <li class="Header-menuItem "> |
| <a href="/about">About</a> |
| </li> |
| </ul> |
| <button class="Header-navOpen js-headerMenuButton Header-navOpen--white" aria-label="Open navigation."> |
| </button> |
| </div> |
| </nav> |
| |
| </div> |
| </header> |
| <aside class="NavigationDrawer js-header"> |
| <nav class="NavigationDrawer-nav"> |
| <div class="NavigationDrawer-header"> |
| <a href="https://go.dev/"> |
| <img class="NavigationDrawer-logo" src="/images/go-logo-blue.svg" alt="Go."> |
| </a> |
| </div> |
| <ul class="NavigationDrawer-list"> |
| <li class="NavigationDrawer-listItem NavigationDrawer-listItem--active"> |
| <a href="/solutions/">Why Go</a> |
| </li> |
| <li class="NavigationDrawer-listItem "> |
| <a href="/learn/">Getting Started</a> |
| </li> |
| <li class="NavigationDrawer-listItem "> |
| <a href="https://pkg.go.dev">Discover Packages</a> |
| </li> |
| <li class="NavigationDrawer-listItem "> |
| <a href="/about">About</a> |
| </li> |
| </ul> |
| </nav> |
| </aside> |
| <div class="NavigationDrawer-scrim js-scrim" role="presentation"></div> |
| <main class="SiteContent SiteContent--default"> |
| <div> |
| <div class="WhoUsesSubPage-hero--caseStudy"> |
| <div class="WhoUsesSubPage-heroInner--caseStudy"> |
| <div class="WhoUsesSubPage-heroContent--caseStudy"> |
| <div class="WhoUsesSubPage-heroText--caseStudy"> |
| |
| <div class="BreadcrumbNav"> |
| <ol class="BreadcrumbNav-inner"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class="BreadcrumbNav-li "> |
| <a class="BreadcrumbNav-link" href="/solutions/"> |
| |
| Why Go |
| |
| </a> |
| </li> |
| |
| |
| |
| |
| |
| <li class="BreadcrumbNav-li "> |
| <a class="BreadcrumbNav-link" href="/solutions/google/"> |
| |
| Google |
| |
| </a> |
| </li> |
| |
| |
| |
| |
| |
| <li class="BreadcrumbNav-li active"> |
| <a class="BreadcrumbNav-link" href="/solutions/google/firebase"> |
| |
| Firebase |
| |
| </a> |
| </li> |
| |
| |
| </ol> |
| |
| </div> |
| <h1>How the Firebase Hosting Team Scaled With Go</h1> |
| |
| |
| </div> |
| |
| <div class="WhoUsesSubPage-heroImg"> |
| <img src="/images/go_firebase_case_study.png" alt="Firebase"> |
| </div> |
| |
| </div> |
| </div> |
| |
| </div> |
| <article class="Article Article--solutions"> |
| |
| <div class="CaseStudy-content"> |
| <div class="CaseStudy-contentBody"> |
| <p>The Firebase Hosting team provides static web hosting services for Google Cloud |
| customers. They provide a static web host that sits behind a global content |
| delivery network, and offer users tools that are easy to use. The team also |
| develops features that range from uploading site files to registering domains to |
| tracking usage.</p> |
| |
| <p>Before joining Google, Firebase Hosting’s tech stack was written in Node.js. The |
| team started to use Go when they needed to interoperate with several other |
| Google services. They decided to use Go to help them scale easily and |
| efficiently, knowing that “concurrency would continue to be a big need.” They |
| “were confident Go would be more performant,” and “liked that Go is more terse” |
| than other languages they were considering, said Michael Bleigh, a software |
| engineer on the team.</p> |
| |
| <p>Starting with one small service written in Go, the team migrated their entire |
| backend in a series of moves. The team progressively identified large features |
| they wanted to implement and, in the process, rewrote them in Go and moved to |
| Google Cloud and Google’s internal cluster management system. <strong>Now the Firebase |
| Hosting team has replaced 100% of backend Node.js code with Go.</strong></p> |
| |
| <p>The team’s experience writing in Go began with one engineer. “Through |
| peer-to-peer learning and Go being generally easy to get started with, everyone |
| on the team now has Go dev experience,” said Bleigh. They’ve found that while a |
| majority of people who are new to the team haven’t had any experience with Go, |
| “most of them are productive within a couple weeks.”</p> |
| |
| <p>“Using Go, it’s easy to see how the code is organized and what the code does,” |
| said Bleigh, speaking for the team. “Go is generally very readable and |
| understandable. The language’s error handling, receivers, and interfaces are all |
| easy to understand due to the idioms in the language.”</p> |
| |
| <p>Concurrency continues to be a focus for the team as they scale. Robert Rossney, |
| a software engineer, shared that “Go makes it very easy to put all of the hard |
| concurrency stuff in one place, and everywhere else it’s abstracted.” Rossney |
| also spoke to the benefits of using a language built with concurrency in mind, |
| saying that “there are also a lot of ways to do concurrency in Go. We’ve had to |
| learn when each route is best, how to determine when a problem is a concurrency |
| problem, how to debug–but that comes out of the fact that you actually can write |
| these patterns in Go code.”</p> |
| |
| <div class="BackgroundQuote"> |
| <p class="BackgroundQuote-body"> |
| “Generally speaking, there’s not a time on the team where we’re feeling |
| frustrated with Go, it just kind of gets out of the way and lets you do work.” |
| </p> |
| <div class="BackgroundQuote-author"> |
| <span>— Robert Rossney</span> |
| , |
| <span class="BackgroundQuote-title">Software Engineer</span> |
| </div> |
| </div> |
| |
| |
| <p>Hundreds of thousands of customers host their websites with Firebase Hosting, |
| which means Go code is used to serve billions of requests per day. “Our customer |
| base and traffic have doubled multiple times since migrating to Go without ever |
| requiring fine-tuned optimizations” shared Bleigh. With Go, the team has seen |
| performance improvements both in the software and on the team, with excellent |
| productivity gains. “Generally speaking,” Rossney mentioned, “…there’s not a |
| time on the team where we’re feeling frustrated with Go, it just kind of gets |
| out of the way and lets you do work.”</p> |
| |
| <p>In addition to the Firebase Hosting team, engineering teams across Google have |
| adopted Go in their development process. Read about how the <a href="/solutions/google/coredata/">Core Data |
| Solutions</a> and <a href="/solutions/google/chrome/">Chrome</a> |
| teams use Go to build fast, reliable, and efficient software at scale.</p> |
| |
| </div> |
| <div class="CaseStudy-contentAside"> |
| <div class="CaseStudy-aboutBlock"> |
| |
| <img src="/images/logos/firebase.svg" class="CaseStudy-aboutBlockImg" alt="Firebase"> |
| <h3 class="CaseStudy-aboutBlockTitle"> |
| About Firebase |
| </h3> |
| |
| <p class="CaseStudy-aboutBlockBody"><p>Firebase is Google’s mobile platform that helps you quickly develop high-quality |
| apps and grow your business.</p> |
| |
| <p>The Firebase Hosting team shared their journey with Go, including their |
| backend migration from Node.js, the ease of onboarding new Go developers, and |
| how Go has helped them scale.</p> |
| </p> |
| |
| </div> |
| </div> |
| </div> |
| |
| </article> |
| </div> |
| </main> |
| <footer class="Site-footer"> |
| <div class="Footer"> |
| <div class="Container"> |
| <div class="Footer-links"> |
| <div class="Footer-linkColumn"> |
| |
| <a href="/solutions/" class="Footer-link Footer-link--primary"> |
| Why Go |
| </a> |
| |
| |
| <a href="/solutions/#use-cases" class="Footer-link"> |
| Use Cases |
| </a> |
| |
| |
| |
| <a href="/solutions/#case-studies" class="Footer-link"> |
| Case Studies |
| </a> |
| |
| |
| </div> |
| <div class="Footer-linkColumn"> |
| |
| <a href="/learn/" class="Footer-link Footer-link--primary"> |
| Getting Started |
| </a> |
| |
| |
| <a href="https://play.golang.org" class="Footer-link"> |
| Playground |
| </a> |
| |
| |
| |
| <a href="https://tour.golang.org" class="Footer-link"> |
| Tour |
| </a> |
| |
| |
| |
| <a href="https://stackoverflow.com/questions/tagged/go?tab=Newest" class="Footer-link"> |
| Stack Overflow |
| </a> |
| |
| |
| </div> |
| <div class="Footer-linkColumn"> |
| |
| <a href="https://pkg.go.dev" class="Footer-link Footer-link--primary"> |
| Discover Packages |
| </a> |
| |
| </div> |
| <div class="Footer-linkColumn"> |
| |
| <a href="/about" class="Footer-link Footer-link--primary"> |
| About |
| </a> |
| |
| |
| <a href="https://golang.org/dl/" class="Footer-link"> |
| Download |
| </a> |
| |
| |
| |
| <a href="https://blog.golang.org" class="Footer-link"> |
| Blog |
| </a> |
| |
| |
| |
| <a href="https://github.com/golang/go/issues" class="Footer-link"> |
| Issue Tracker |
| </a> |
| |
| |
| |
| <a href="https://golang.org/doc/devel/release.html" class="Footer-link"> |
| Release Notes |
| </a> |
| |
| |
| |
| <a href="https://blog.golang.org/go-brand" class="Footer-link"> |
| Brand Guidelines |
| </a> |
| |
| |
| |
| <a href="https://golang.org/conduct" class="Footer-link"> |
| Code of Conduct |
| </a> |
| |
| |
| </div> |
| <div class="Footer-linkColumn"> |
| |
| <a href="https://www.twitter.com/golang" class="Footer-link Footer-link--primary"> |
| Connect |
| </a> |
| |
| |
| <a href="https://www.twitter.com/golang" class="Footer-link"> |
| Twitter |
| </a> |
| |
| |
| |
| <a href="https://github.com/golang" class="Footer-link"> |
| GitHub |
| </a> |
| |
| |
| |
| <a href="https://invite.slack.golangbridge.org/" class="Footer-link"> |
| Slack |
| </a> |
| |
| |
| |
| <a href="https://reddit.com/r/golang" class="Footer-link"> |
| r/golang |
| </a> |
| |
| |
| |
| <a href="https://www.meetup.com/pro/go" class="Footer-link"> |
| Meetup |
| </a> |
| |
| |
| |
| <a href="https://golangweekly.com/" class="Footer-link"> |
| Golang Weekly |
| </a> |
| |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="Footer"> |
| <div class="Container Container--fullBleed"> |
| <div class="Footer-bottom"> |
| <img class="Footer-gopher" src="/images/gophers/pilot-bust.svg" alt="The Go Gopher"> |
| <ul class="Footer-listRow"> |
| <li class="Footer-listItem"> |
| <a href="/copyright">Copyright</a> |
| </li> |
| <li class="Footer-listItem"> |
| <a href="/tos">Terms of Service</a> |
| </li> |
| <li class="Footer-listItem"> |
| <a href="http://www.google.com/intl/en/policies/privacy/" |
| target="_blank" |
| rel="noopener"> |
| Privacy Policy |
| </a> |
| </li> |
| <li class="Footer-listItem"> |
| <a |
| href="https://golang.org/s/discovery-feedback" |
| target="_blank" |
| rel="noopener" |
| > |
| Report an Issue |
| </a> |
| </li> |
| <li class="Footer-listItem"> |
| <a |
| href="https://golang.org" |
| target="_blank" |
| rel="noopener" |
| >golang.org |
| </a> |
| </li> |
| </ul> |
| <a class="Footer-googleLogo" target="_blank" href="https://google.com" rel="noopener"> |
| <img class="Footer-googleLogoImg" src="/images/google-white.png" alt="Google logo"> |
| </a> |
| </div> |
| </div> |
| </div> |
| <script src="/js/carousels.js"></script> |
| <script src="/js/searchBox.js"></script> |
| <script src="/js/misc.js"></script> |
| <script src="/js/hats.js"></script> |
| </footer> |
| </body> |
| </html> |