Переход на Scala: босиком по граблям

37
Переход на Scala: босиком по граблям

Transcript of Переход на Scala: босиком по граблям

Page 1: Переход на Scala: босиком по граблям

Переход на Scala: босиком по граблям

Page 2: Переход на Scala: босиком по граблям

Data Processing Team

Page 3: Переход на Scala: босиком по граблям

Java / Scala / Clojure / Groovy / ?

JVM

Page 4: Переход на Scala: босиком по граблям

“Во-первых, это красиво…” *

Почему Scala?

Page 5: Переход на Scala: босиком по граблям

akka-http / spray / finagle / play

REST & HTTP

Page 6: Переход на Scala: босиком по граблям

Spray

Page 7: Переход на Scala: босиком по граблям

Implicits

Page 8: Переход на Scala: босиком по граблям

def strangeIdea(n: Int)(implicit s: String) = s * n

Page 9: Переход на Scala: босиком по граблям

package spray.routing

...

trait HttpServiceBase extends Directives {

/** * Supplies the actor behavior for executing the given route. */ def runRoute(route: Route)(implicit eh: ExceptionHandler, rh: RejectionHandler, ac: ActorContext, rs: RoutingSettings, log: LoggingContext): Actor.Receive = {...}

Page 10: Переход на Scala: босиком по граблям

def createOrUpdateCookieProfileRoute(): Route = post { pathPrefix(ApiVersion) { pathPrefix("cookies" / Segment) { cookieId => path("cookieProfiles" / IntNumber) { trackingSetupId => parameters('cookieSetTime.as[DateTime].?, 'cookieLastSeenTime.as[DateTime].?) { (cookieSetTime, cookieLastSeenTime) => entity(as[CookieProfile]) { cookieProfile => traceName("POST COOKIE PROFILE") { ctx => val serviceActor: ActorRef = newStorageServiceActor() val message = MergeCookieProfile(ctx, cookieProfile, cookieSetTime, cookieLastSeenTime) serviceActor.tell(message, ActorRef.noSender) } } } } } } }

Page 11: Переход на Scala: босиком по граблям

trait JsonSerializerSupport {

implicit val formats = DefaultFormats ++ BinaryTypeSerializers.all ++ JodaTimeSerializers.all}

Page 12: Переход на Scala: босиком по граблям

https://github.com/gettyimages/spray-swagger

Swagger

Page 13: Переход на Scala: босиком по граблям

@ApiOperation( httpMethod = "POST", value = "Create/Update CookieProfile by cookieId and trackingSetupId", notes = "Creates new CookieProfile if it doesn't exists or updates old one if it exists in storage.”) @ApiImplicitParams(Array( new ApiImplicitParam( name = Fields.CookieId, value = Description.CookieId, required = true, dataType = DataTypes.String, paramType = ParamType.Path), new ApiImplicitParam( name = Fields.TrackingSetupId, value = Description.TrackingSetupId, required = true, dataType = DataTypes.Integer, paramType = ParamType.Path), new ApiImplicitParam( name = Fields.CookieSetTime, value = Description.CookieSetTime, dataType = DataTypes.String, paramType = ParamType.Query), new ApiImplicitParam( name = Fields.CookieLastSeenTime, value = Description.CookieLastSeenTime, dataType = DataTypes.String, paramType = ParamType.Query), new ApiImplicitParam( name = Fields.Body, value = Description.Body, required = true, dataType = DataTypes.CookieProfile, paramType = ParamType.Body))) @ApiResponses(Array( new ApiResponse(code = 200, message = Responses.Ok, response = classOf[SuccessResponse]), new ApiResponse(code = 400, message = Responses.BadRequest, response = classOf[ErrorResponse]), new ApiResponse(code = 500, message = Responses.InternalError, response = classOf[ErrorResponse]), new ApiResponse(code = 503, message = Responses.ServiceUnavailable))) @Path("/{cookieId}/cookieProfiles/{trackingSetupId}")

Page 14: Переход на Scala: босиком по граблям

Akka

Page 15: Переход на Scala: босиком по граблям

“blocking problem”

Page 16: Переход на Scala: босиком по граблям

Shared state

Page 17: Переход на Scala: босиком по граблям

Как это тестировать?

Page 18: Переход на Scala: босиком по граблям

test("return 404 code for not existing cookie with cookieProfiles") { Get("/v1/cookies/777/cookieProfiles") ~> route ~> check { handled should be(right = true) response.status should be(StatusCodes.NotFound) } }

Page 19: Переход на Scala: босиком по граблям

http://gatling.io/

Нагрузочные тесты

Page 20: Переход на Scala: босиком по граблям

DevOps

Page 21: Переход на Scala: босиком по граблям

Отличное решение

Kamonhttp://kamon.io/

Page 22: Переход на Scala: босиком по граблям

Если вы сами готовы его допиливать

Page 23: Переход на Scala: босиком по граблям

ELK & Grafana

Page 24: Переход на Scala: босиком по граблям

Maven & sbt

Page 25: Переход на Scala: босиком по граблям

Что бы могло пойти не так?

Итак, вы решили перейти на Scala

Page 26: Переход на Scala: босиком по граблям

Сложность и академичность

Page 27: Переход на Scala: босиком по граблям

IDE

Page 28: Переход на Scala: босиком по граблям

OOP & FP

Page 29: Переход на Scala: босиком по граблям

Explicit is better than implicit

Много споров о стиле

Page 30: Переход на Scala: босиком по граблям
Page 31: Переход на Scala: босиком по граблям

Take it easy

Page 32: Переход на Scala: босиком по граблям

Плавный переход к Scala

Page 33: Переход на Scala: босиком по граблям

Инкрементальное внедрение языка

Page 34: Переход на Scala: босиком по граблям

Постоянное изучение

Page 35: Переход на Scala: босиком по граблям

“Технологии идеальны, а люди – *удаки” **

Page 36: Переход на Scala: босиком по граблям

Svetlana Bozhko aka @[email protected]@gmail.com

http://devzen.ru

Спасибо!

Page 37: Переход на Scala: босиком по граблям

* — Старый анекдот** — Baruch Sadogursky aka @jbaruch

Источники: