Salesforce Functions の実装を試しました。 ・ライブラリーの使用方法 ・並列実行
Salesforce functions (Java)で実装はどう変わるかSato Ryo
View Slide
Hello!Sato Ryoです。(左はクレオです。)仕事:´ バックエンド( 業務処理の開発担当) です。´ Salesforce 歴 2.5 年くらいの初⼼者です。趣味:• ネコ• キャンプ@altyjp
Salesforce functions GA 🎉https://developer.salesforce.com/docs/platform/functions/overview
Java版の資料は少ないNode.js 版についてはいくつか資料がありますが、Java版は資料が少ないように思います。´ クイックスタートガイド´ https://developer.salesforce.com/docs/platform/functions/guide/create-function.html´ しょっさん(Salesforce の中の⼈)のブログ記事´ https://zenn.dev/sho7650/articles/f1b0c096847277→Java 版を利⽤して気になった事を検証していきたいと思います。
お品書き´ ライブラリってどうなってるの︖´ 並列処理はできる︖効果ある︖なお、実際のソースコードは以下にあります。是⾮お試しください。https://github.com/altyjp/Trying-SF-functions注意事項︓問題により実際のFunctions へのデプロイができなかったため、本発表における実⾏時間などの値はローカル環境(MacBookAir 2018, Core i5, 8GB RAM)での実⾏結果を利⽤しております。あくまで参考結果としてご覧ください。
ライブラリってどうなってるの︖´ Java で function を作成すると左記のようなファイルが⽣成されます。´ Mavenを利⽤しているので、pom.xml に使いたいライブラリを記載することで利⽤する事ができます。
ライブラリが利⽤できるメリット´ Apexではcsvなどを扱うライブラリが無いため⾃前で処理が必要になる。´ ライブラリを利⽤することで安全かつ効率的にコーディング可能。// opencsv で書き出す。beanToCsv.write(accounts);// 出⼒LOGGER.info(writer.toString());// Account を Csv にする。for(Account acc : accountList){String accountId = acc.Id;String accountName = acc.Name;// ⾃前で組み⽴てが必要String csvRow = '"' + accountId +'","' + accountName + '"';csvStr.add(csvRow);}System.debug(csvStr);LibrarysampleFunction.javawithoutLibrary.apex
並列実⾏は利⽤できる︖効果は︖
Apexでは並列処理を実装できないので´ 重い処理でもforを利⽤しないといけない。// 1000から5999までの素数を⾒つけるfor (Integer num : intList){Boolean isPrime = true;for (Integer i = 2; i < num; i++) {if (Math.mod(num, i) == 0){isPrime = false;break;}}// System.LimitException: Apex CPU time limit exceeded(10s以上)if (isPrime) {System.debug(num);}}processList.apex
Functions なら重い処理も爆速´ parallelStreamを利⽤して、複数のスレッドで処理を分散可能。´ 重い処理も⽐較にならない速度で実⾏できます。ちなみに以下の処理、どのくらいの時間で終わると思いますか︖// 1000から5999までの素数を⾒つける。intList.parallelStream().filter(n -> isPrime(n)).forEach(System.out::println);ParallelexecutionFunction.java
まとめ´ ライブラリを利⽤することで安全かつ効率的に実装が⾏える。´ 特にCSVやyamlなどテキストデータを処理する場合。´ 他にはエクセル(.xlsx)などのこれまで対応できなかったバイナリファイルなども。´ 重い処理も並列実⾏で⾼速に実⾏できる。´ これにより、今までガバナ制限によって不可能だった処理も1トランザクションで実⾏可能になるかもしれない。
Thank you!