I think you’d want to make it a configuration option, so that development can 
still come up quickly, but that sounds great for production.

I’ve spent some time bouncing between Dmitry and Ben’s approaches. With the 
latter I simplified it with Jsoup, but there are considerable limitations to 
what can be preloaded that way.

Dmitry, I have tried to flesh out what you’ve done, but I think my knowledge of 
Tapestry internals is holding me back. You seem to have taken a really deep 
dive! Is there any code that you’d feel comfortable sharing?

Cheers,

Geoff

> On 4 Dec 2021, at 6:00 am, Thiago H. de Paula Figueiredo <thiag...@gmail.com> 
> wrote:
> 
> Hi!
> 
> Today I started wondering about how we could get Tapestry to run under
> Quarkus.io, including generating a native executable. Of course, this won't
> include bytecode generated in runtime, something many libraries and
> frameworks do, Tapestry very much included. Then I researched a bit and
> found this: https://quarkus.io/guides/writing-extensions#bytecode-recording.
> Basically, it's a hook for you to run the code that will generate bytecode
> while the hook records everything (if I got it right). So, to write an
> extension for Tapestry, we would need to have every page and and every
> service (and maybe some other stuff too) fully realized, since Tapestry-IoC
> and Tapestry load mostly everything in a lazy manner. This is something
> that could also solve Geoff's question: if we can somehow force Tapestry to
> preload everything, then the app is ready and (at least mostly) warm when
> the first request is properly served.
> 
> With the code Dmitry shared here, I wonder if you want to collaborate on
> implementing this preload feature on Tapestry itself out-of-the-box,
> avoiding some ugly workarounds needed since there's no actual support for
> that. :)
> 
> Cheers!
> 
> On Mon, Nov 29, 2021 at 7:36 PM Dmitry Gusev <dmitry.gu...@gmail.com> wrote:
> 
>> Hi Geoff,
>> 
>> I don't think there's a simpler way, we're doing something similar.
>> 
>> We created a REST endpoint with tynamo-resteasy which is effectively a load
>> balancer health check.
>> On the first hit it starts the warmup process on the same request,
>> following requests return an error instantly if the initial warmup routine
>> is still in progress.
>> 
>> Our warmup logic is heavily based on tapestry internals & reflection, in
>> conjunction with eager loading services as described here:
>> https://gist.github.com/dmitrygusev/5562739
>> 
>> Warmup logic is a bit complicated, it's trying to:
>> - "touch" each page using ComponentClassResolver.getPageNames()
>> - recursively for each component with mixins on a page starting from root
>> component,
>>> find imported assets via reflection (fields with names starting as
>> `importedAssets_`)
>>> stream each asset via `StreamableResourceSource` into no-op consumer
>> - find JS modules with `ModuleManager` and stream through no-op consumer
>> - every JS stack returned from `JavaScriptStackSource` assemble with
>> `JavaScriptStackAssembler` and stream through no-op consumer
>> - repeat above for each locale/axis
>> 
>> Entire process usually takes 3-5 minute in our setup.
>> After it's done we return 200 to the load balancer and the first real
>> request is handled with hot caches.
>> 
>> Hope this helps,
>> Dmitry
>> 
>> On Mon, Nov 29, 2021 at 9:53 PM JumpStart <
>> geoff.callender.jumpst...@gmail.com> wrote:
>> 
>>> Any suggestions on best ways to write a “health check” page to be called
>>> by load balancers?
>>> 
>>> My app is getting big, and the traffic is big. If the app fails
>> (hopefully
>>> never, but it’s a JVM) and the traffic is heavy enough, startup never
>> seems
>>> to complete - every request times out, the app log goes quiet, and CPU
>> goes
>>> to 100%. It appears to be due to race conditions possibly involving asset
>>> compression, minimising, and first time into the pages.
>>> 
>>> I’m considering having a startup service crawl every page, in every
>>> language, in every skinning, before setting a singleton flag that the
>>> health check page will read to determine whether the app is ready to
>>> receive traffic.
>>> 
>>> Is there a simpler way?
>>> 
>>> Geoff
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>> 
>>> 
>> 
> 
> 
> -- 
> Thiago


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to