mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-02 17:28:45 +02:00
b389c3d302
Pushservice is the main recommendation service we use to surface recommendations to our users via notifications. It fetches candidates from various sources, ranks them in order of relevance, and applies filters to determine the best one to send.
194 lines
6.5 KiB
Scala
194 lines
6.5 KiB
Scala
package com.twitter.frigate.pushservice
|
|
|
|
import com.twitter.discovery.common.environment.modules.EnvironmentModule
|
|
import com.twitter.finagle.Filter
|
|
import com.twitter.finatra.annotations.DarkTrafficFilterType
|
|
import com.twitter.finatra.decider.modules.DeciderModule
|
|
import com.twitter.finatra.http.HttpServer
|
|
import com.twitter.finatra.http.filters.CommonFilters
|
|
import com.twitter.finatra.http.routing.HttpRouter
|
|
import com.twitter.finatra.mtls.http.{Mtls => HttpMtls}
|
|
import com.twitter.finatra.mtls.thriftmux.{Mtls => ThriftMtls}
|
|
import com.twitter.finatra.mtls.thriftmux.filters.MtlsServerSessionTrackerFilter
|
|
import com.twitter.finatra.thrift.ThriftServer
|
|
import com.twitter.finatra.thrift.filters.ExceptionMappingFilter
|
|
import com.twitter.finatra.thrift.filters.LoggingMDCFilter
|
|
import com.twitter.finatra.thrift.filters.StatsFilter
|
|
import com.twitter.finatra.thrift.filters.ThriftMDCFilter
|
|
import com.twitter.finatra.thrift.filters.TraceIdMDCFilter
|
|
import com.twitter.finatra.thrift.routing.ThriftRouter
|
|
import com.twitter.frigate.common.logger.MRLoggerGlobalVariables
|
|
import com.twitter.frigate.pushservice.controller.PushServiceController
|
|
import com.twitter.frigate.pushservice.module._
|
|
import com.twitter.inject.TwitterModule
|
|
import com.twitter.inject.annotations.Flags
|
|
import com.twitter.inject.thrift.modules.ThriftClientIdModule
|
|
import com.twitter.logging.BareFormatter
|
|
import com.twitter.logging.Level
|
|
import com.twitter.logging.LoggerFactory
|
|
import com.twitter.logging.{Logging => JLogging}
|
|
import com.twitter.logging.QueueingHandler
|
|
import com.twitter.logging.ScribeHandler
|
|
import com.twitter.product_mixer.core.module.product_mixer_flags.ProductMixerFlagModule
|
|
import com.twitter.product_mixer.core.module.ABDeciderModule
|
|
import com.twitter.product_mixer.core.module.FeatureSwitchesModule
|
|
import com.twitter.product_mixer.core.module.StratoClientModule
|
|
|
|
object PushServiceMain extends PushServiceFinatraServer
|
|
|
|
class PushServiceFinatraServer
|
|
extends ThriftServer
|
|
with ThriftMtls
|
|
with HttpServer
|
|
with HttpMtls
|
|
with JLogging {
|
|
|
|
override val name = "PushService"
|
|
|
|
override val modules: Seq[TwitterModule] = {
|
|
Seq(
|
|
ABDeciderModule,
|
|
DeciderModule,
|
|
FeatureSwitchesModule,
|
|
FilterModule,
|
|
FlagModule,
|
|
EnvironmentModule,
|
|
ThriftClientIdModule,
|
|
DeployConfigModule,
|
|
ProductMixerFlagModule,
|
|
StratoClientModule,
|
|
PushHandlerModule,
|
|
PushTargetUserBuilderModule,
|
|
PushServiceDarkTrafficModule,
|
|
LoggedOutPushTargetUserBuilderModule,
|
|
new ThriftWebFormsModule(this),
|
|
)
|
|
}
|
|
|
|
override def configureThrift(router: ThriftRouter): Unit = {
|
|
router
|
|
.filter[ExceptionMappingFilter]
|
|
.filter[LoggingMDCFilter]
|
|
.filter[TraceIdMDCFilter]
|
|
.filter[ThriftMDCFilter]
|
|
.filter[MtlsServerSessionTrackerFilter]
|
|
.filter[StatsFilter]
|
|
.filter[Filter.TypeAgnostic, DarkTrafficFilterType]
|
|
.add[PushServiceController]
|
|
}
|
|
|
|
override def configureHttp(router: HttpRouter): Unit =
|
|
router
|
|
.filter[CommonFilters]
|
|
|
|
override protected def start(): Unit = {
|
|
MRLoggerGlobalVariables.setRequiredFlags(
|
|
traceLogFlag = injector.instance[Boolean](Flags.named(FlagModule.mrLoggerIsTraceAll.name)),
|
|
nthLogFlag = injector.instance[Boolean](Flags.named(FlagModule.mrLoggerNthLog.name)),
|
|
nthLogValFlag = injector.instance[Long](Flags.named(FlagModule.mrLoggerNthVal.name))
|
|
)
|
|
}
|
|
|
|
override protected def warmup(): Unit = {
|
|
handle[PushMixerThriftServerWarmupHandler]()
|
|
}
|
|
|
|
override protected def configureLoggerFactories(): Unit = {
|
|
loggerFactories.foreach { _() }
|
|
}
|
|
|
|
override def loggerFactories: List[LoggerFactory] = {
|
|
val scribeScope = statsReceiver.scope("scribe")
|
|
List(
|
|
LoggerFactory(
|
|
level = Some(levelFlag()),
|
|
handlers = handlers
|
|
),
|
|
LoggerFactory(
|
|
node = "request_scribe",
|
|
level = Some(Level.INFO),
|
|
useParents = false,
|
|
handlers = QueueingHandler(
|
|
maxQueueSize = 10000,
|
|
handler = ScribeHandler(
|
|
category = "frigate_pushservice_log",
|
|
formatter = BareFormatter,
|
|
statsReceiver = scribeScope.scope("frigate_pushservice_log")
|
|
)
|
|
) :: Nil
|
|
),
|
|
LoggerFactory(
|
|
node = "notification_scribe",
|
|
level = Some(Level.INFO),
|
|
useParents = false,
|
|
handlers = QueueingHandler(
|
|
maxQueueSize = 10000,
|
|
handler = ScribeHandler(
|
|
category = "frigate_notifier",
|
|
formatter = BareFormatter,
|
|
statsReceiver = scribeScope.scope("frigate_notifier")
|
|
)
|
|
) :: Nil
|
|
),
|
|
LoggerFactory(
|
|
node = "push_scribe",
|
|
level = Some(Level.INFO),
|
|
useParents = false,
|
|
handlers = QueueingHandler(
|
|
maxQueueSize = 10000,
|
|
handler = ScribeHandler(
|
|
category = "test_frigate_push",
|
|
formatter = BareFormatter,
|
|
statsReceiver = scribeScope.scope("test_frigate_push")
|
|
)
|
|
) :: Nil
|
|
),
|
|
LoggerFactory(
|
|
node = "push_subsample_scribe",
|
|
level = Some(Level.INFO),
|
|
useParents = false,
|
|
handlers = QueueingHandler(
|
|
maxQueueSize = 2500,
|
|
handler = ScribeHandler(
|
|
category = "magicrecs_candidates_subsample_scribe",
|
|
maxMessagesPerTransaction = 250,
|
|
maxMessagesToBuffer = 2500,
|
|
formatter = BareFormatter,
|
|
statsReceiver = scribeScope.scope("magicrecs_candidates_subsample_scribe")
|
|
)
|
|
) :: Nil
|
|
),
|
|
LoggerFactory(
|
|
node = "mr_request_scribe",
|
|
level = Some(Level.INFO),
|
|
useParents = false,
|
|
handlers = QueueingHandler(
|
|
maxQueueSize = 2500,
|
|
handler = ScribeHandler(
|
|
category = "mr_request_scribe",
|
|
maxMessagesPerTransaction = 250,
|
|
maxMessagesToBuffer = 2500,
|
|
formatter = BareFormatter,
|
|
statsReceiver = scribeScope.scope("mr_request_scribe")
|
|
)
|
|
) :: Nil
|
|
),
|
|
LoggerFactory(
|
|
node = "high_quality_candidates_scribe",
|
|
level = Some(Level.INFO),
|
|
useParents = false,
|
|
handlers = QueueingHandler(
|
|
maxQueueSize = 2500,
|
|
handler = ScribeHandler(
|
|
category = "frigate_high_quality_candidates_log",
|
|
maxMessagesPerTransaction = 250,
|
|
maxMessagesToBuffer = 2500,
|
|
formatter = BareFormatter,
|
|
statsReceiver = scribeScope.scope("high_quality_candidates_scribe")
|
|
)
|
|
) :: Nil
|
|
),
|
|
)
|
|
}
|
|
}
|