MoreRSS

site iconHackerNoonModify

We are an open and international community of 45,000+ contributing writers publishing stories and expertise for 4+ million curious and insightful monthly readers.
Please copy the RSS to your reader, or quickly subscribe to:

Inoreader Feedly Follow Feedbin Local Reader

Rss preview of Blog of HackerNoon

SeaTunnel × Gravitino:基于 Schema URL 的自动表结构检测

2026-03-22 17:03:38

Recently, the community published an article titled “Say Goodbye to Hand-Written Schemas! SeaTunnel’s Integration with Gravitino Metadata REST API Is a Really Cool Move”, which drew strong reactions from readers, with many saying, “This is really awesome!”

The contributor behind this feature is extremely proactive, and it’s expected to be available soon (according to reliable sources, likely in version 3.0.0). To help the community better understand it, the contributor wrote a detailed article explaining the initial capabilities of the Gravitino REST API and how to use it—let’s take a closer look!

\

1. Background and Problems to Solve

When using Apache SeaTunnel for batch or sync tasks, if the source is unstructured or semi-structured, the source usually requires an explicit schema definition (field names, types, order).

In real production environments, this leads to several typical issues:

  • Tables have many fields and complex types, making manual schema maintenance costly and error-prone
  • Upstream table structure changes (adding fields, changing types) require corresponding updates to SeaTunnel jobs
  • For existing tables, simply syncing data still requires repeated metadata description, leading to redundancy

Thus, the core question is:

Can SeaTunnel directly reuse table structure definitions from an existing metadata system, instead of declaring schema repeatedly in jobs?

\ This feature was introduced to solve this problem.

\

2. Introduction to Gravitino (Relevant Capabilities)

Gravitino is a unified metadata management and access service, providing standardized REST APIs to manage and expose the following objects:

  • Metalake (logical isolation unit)
  • Catalogs (e.g., MySQL, Hive, Iceberg)
  • Schema / Database
  • Table and its field definitions

With Gravitino:

  • Table structures can be centrally managed
  • Downstream systems can dynamically fetch schema definitions via HTTP APIs
  • No need to maintain field information in every compute or sync job

The new capability introduced in SeaTunnel is:

Support for automatically pulling table structures via schema_url provided by Gravitino in the source schema definition.

\

3. Local Test Environment Setup

3.1 Prepare MySQL Environment

3.1.1 Create Target Table

Pre-create the target table test.demo_user in MySQL with the following SQL:

CREATE TABLE `demo_user` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_code` varchar(32) NOT NULL,
  `user_name` varchar(64) DEFAULT NULL,
  `password` varchar(128) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `gender` tinyint DEFAULT NULL,
  `age` int DEFAULT NULL,
  `status` tinyint DEFAULT NULL,
  `level` int DEFAULT NULL,
  `score` decimal(10,2) DEFAULT NULL,
  `balance` decimal(12,2) DEFAULT NULL,
  `is_deleted` tinyint DEFAULT NULL,
  `register_ip` varchar(45) DEFAULT NULL,
  `last_login_ip` varchar(45) DEFAULT NULL,
  `login_count` int DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  `ext1` varchar(100) DEFAULT NULL,
  `ext2` varchar(100) DEFAULT NULL,
  `ext3` varchar(100) DEFAULT NULL,
  `ext4` varchar(100) DEFAULT NULL,
  `ext5` varchar(100) DEFAULT NULL,
  `created_by` varchar(64) DEFAULT NULL,
  `updated_by` varchar(64) DEFAULT NULL,
  `created_time` datetime DEFAULT NULL,
  `updated_time` datetime DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `last_login_time` datetime DEFAULT NULL,
  `version` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_code` (`user_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.1.2 Create the Table Schema to Sync

In practice, table structures might be managed centrally in components like paimonhive, or hudi. For testing, the table schema points to the target table test.demo_user created in the previous step.

3.2 Register the Table Schema in Gravitino

Gravitino supports direct database connections and scans all tables in a database

\ img

\

This table is managed in Gravitino as a table under the local-mysql catalog.

\ img_1

\ Metalake: test_Metalake

3.3 Table Structure Access Explanation

Table structures in Gravitino can be accessed via the REST API:

http://localhost:8090/api/metalakes/test_Metalake/catalogs/${catalog}/schemas/${schema}/tables/${table}

In this test, the actual schema_url used is:

http://localhost:8090/api/metalakes/test_Metalake/catalogs/local-mysql/schemas/test/tables/demo_user

The returned JSON contains the complete field definitions of the demo_user table.

img_2

\

3.4 Local Deployment of SeaTunnel

Since this feature hasn’t been officially released, you need to manually compile the latest dev branch and deploy it locally.

3.5 Prepare Data Files

This test case uses a CSV file containing 2,000 records.

img_3

\

4. SeaTunnel Job Configuration

4.1 Core Configuration Example

env {
  parallelism = 1
  job.mode = "BATCH"
}
source {
  LocalFile {
    path = "/Users/wangxuepeng/Desktop/seatunnel/apache-seatunnel-2.3.13-SNAPSHOT/test_data"
    file_format_type = "csv"
    schema {
      schema_url = "http://localhost:8090/api/metalakes/test_Metalake/catalogs/local-mysql/schemas/test/tables/demo_user"
    }
  }
}
sink {
  jdbc {
    url = "jdbc:mysql://localhost:3306/test"
    driver = "com.mysql.cj.jdbc.Driver"
    username = "root"
    password = "123456"
    database = "test"
    table = "demo_user"
    generate_sink_sql = true
  }
}

4.2 Key Configuration Notes

  • schema.schema_url

  • Points to the table metadata REST API in Gravitino

  • SeaTunnel automatically fetches the table schema at job start

  • No need to manually declare field lists in jobs

  • generatesinksql = true

  • Sink automatically generates INSERT SQL based on the parsed schema

    \

5. Data and Job Execution Results

Log screenshot:

img_4

\ During job execution:

  • Source automatically parses field structure via schema_url

  • CSV fields automatically align with the table schema

  • Data successfully written to MySQL demo_usertable

    \

6. FAQ

6.1 Supported Connectors

Currently, the dev branch supports file-type connectors including localhdfss3, etc.

6.2 Does schema_url support multiple tables?

The feature does not affect multi-table functionality and can be used in combination, e.g.:

source {
  LocalFile {
    tables_configs = [
      {
        path = "/seatunnel/read/metalake/table1"
        file_format_type = "csv"
        field_delimiter = ","
        row_delimiter = "\n"
        skip_header_row_number = 1
        schema {
          table = "db.table1"
          fields {
            c_string = string
            c_int = int
            c_boolean = boolean
            c_double = double
          }
        }
      },
      {
        path = "/seatunnel/read/metalake/table2"
        file_format_type = "csv"
        field_delimiter = ","
        row_delimiter = "\n"
        skip_header_row_number = 1
        schema {
          table = "db.table2"
          schema_url = "http://gravitino:8090/api/metalakes/test_metalake/catalogs/test_catalog/schemas/test_schema/tables/table2"
        }
      }
    ]
  }
}

\

7. Feature Summary

By introducing Gravitino schema_url–based automatic schema parsing, SeaTunnel gains the following advantages in data sync scenarios:

  • Eliminates repeated schema definitions, reducing job configuration complexity
  • Reuses a unified metadata management system, improving consistency
  • Job-friendly in case of table structure changes, significantly lowering maintenance costs

This feature is ideal for:

  • Enterprises with mature metadata platforms

  • Large tables with many fields or frequent schema changes

  • Users seeking improved maintainability of SeaTunnel jobs

    \

8. References

\

落叶松之旅

2026-03-22 17:01:36

:::info Astounding Stories of Super-Science October 2022, by Astounding Stories is part of HackerNoon’s Book Blog Post series. You can jump to any chapter in this book here. THE MURDER OF ROGER ACKROYD - I LEARN MY NEIGHBOR’S PROFESSION

Astounding Stories of Super-Science October 2022: THE MURDER OF ROGER ACKROYD - I LEARN MY NEIGHBOR’S PROFESSION

\ By Agatha Christie

:::

On the following morning I hurried unforgivably over my round. My excuse can be that I had no very serious cases to attend. On my return Caroline came into the hall to greet me.

“Flora Ackroyd is here,” she announced in an excited whisper.

“What?”

I concealed my surprise as best I could.

“She’s very anxious to see you. She’s been here half an hour.”

Caroline led the way into our small sitting-room, and I followed.

Flora was sitting on the sofa by the window. She was in black and she sat nervously twisting her hands together. I was shocked by the sight of her face. All the color had faded away from it. But when she spoke her manner was as composed and resolute as possible.

“Dr. Sheppard, I have come to ask you to help me.”

“Of course he’ll help you, my dear,” said Caroline.

I don’t think Flora really wished Caroline to be present at the interview. She would, I am sure, have infinitely preferred to speak to me privately. But she also wanted to waste no time, so she made the best of it.

“I want you to come to The Larches with me.”

“The Larches?” I queried, surprised.

“To see that funny little man?” exclaimed Caroline.

“Yes. You know who he is, don’t you?”

“We fancied,” I said, “that he might be a retired hairdresser.”

Flora’s blue eyes opened very wide.

“Why, he’s Hercule Poirot! You know who I mean—the private detective. They say he’s done the most wonderful things—just like detectives do in books. A year ago he retired and came to live down here. Uncle knew who he was, but he promised not to tell any one, because M. Poirot wanted to live quietly without being bothered by people.”

“So that’s who he is,” I said slowly.

“You’ve heard of him, of course?”

“I’m rather an old fogey, as Caroline tells me,” I said, “but I have just heard of him.”

“Extraordinary!” commented Caroline.

I don’t know what she was referring to—possibly her own failure to discover the truth.

“You want to go and see him?” I asked slowly. “Now why?”

“To get him to investigate this murder, of course,” said Caroline sharply. “Don’t be so stupid, James.”

I was not really being stupid. Caroline does not always understand what I am driving at.

“You haven’t got confidence in Inspector Davis?” I went on.

“Of course she hasn’t,” said Caroline. “I haven’t either.”

Any one would have thought it was Caroline’s uncle who had been murdered.

“And how do you know he would take up the case?” I asked. “Remember he has retired from active work.”

“That’s just it,” said Flora simply. “I’ve got to persuade him.”

“You are sure you are doing wisely?” I asked gravely.

“Of course she is,” said Caroline. “I’ll go with her myself if she likes.”

“I’d rather the doctor came with me if you don’t mind, Miss Sheppard,” said Flora.

She knows the value of being direct on certain occasions. Any hints would certainly have been wasted on Caroline.

“You see,” she explained, following directness with tact, “Dr. Sheppard being the doctor, and having found the body, he would be able to give all the details to M. Poirot.”

“Yes,” said Caroline grudgingly, “I see that.”

I took a turn or two up and down the room.

“Flora,” I said gravely, “be guided by me. I advise you not to drag this detective into the case.”

Flora sprang to her feet. The color rushed into her cheeks.

“I know why you say that,” she cried. “But it’s exactly for that reason I’m so anxious to go. You’re afraid! But I’m not. I know Ralph better than you do.”

“Ralph,” said Caroline. “What has Ralph got to do with it?”

Neither of us heeded her.

“Ralph may be weak,” continued Flora. “He may have done foolish things in the past—wicked things even—but he wouldn’t murder any one.”

“No, no,” I exclaimed. “I never thought it of him.”

“Then why did you go to the Three Boars last night?” demanded Flora, “on your way home—after uncle’s body was found?”

I was momentarily silenced. I had hoped that that visit of mine would remain unnoticed.

“How did you know about that?” I countered.

“I went there this morning,” said Flora. “I heard from the servants that Ralph was staying there——”

I interrupted her.

“You had no idea that he was in King’s Abbot?”

“No. I was astounded. I couldn’t understand it. I went there and asked for him. They told me, what I suppose they told you last night, that he went out at about nine o’clock yesterday evening—and—and never came back.”

Her eyes met mine defiantly, and as though answering something in my look, she burst out:—

“Well, why shouldn’t he? He might have gone—anywhere. He may even have gone back to London.”

“Leaving his luggage behind?” I asked gently.

Flora stamped her foot.

“I don’t care. There must be a simple explanation.”

“And that’s why you want to go to Hercule Poirot?79 Isn’t it better to leave things as they are? The police don’t suspect Ralph in the least, remember. They’re working on quite another tack.”

“But that’s just it,” cried the girl. “They do suspect him. A man from Cranchester turned up this morning—Inspector Raglan, a horrid, weaselly little man. I found he had been to the Three Boars this morning before me. They told me all about his having been there, and the questions he had asked. He must think Ralph did it.”

“That’s a change of mind from last night, if so,” I said slowly. “He doesn’t believe in Davis’s theory that it was Parker then?”

“Parker indeed,” said my sister, and snorted.

Flora came forward and laid her hand on my arm.

“Oh! Dr. Sheppard, let us go at once to this M. Poirot. He will find out the truth.”

“My dear Flora,” I said gently, laying my hand on hers. “Are you quite sure it is the truth we want?”

She looked at me, nodding her head gravely.

“You’re not sure,” she said. “I am. I know Ralph better than you do.”

“Of course he didn’t do it,” said Caroline, who had been keeping silent with great difficulty. “Ralph may be extravagant, but he’s a dear boy, and has the nicest manners.”

I wanted to tell Caroline that large numbers of murderers have had nice manners, but the presence of Flora restrained me. Since the girl was determined, I was forced to give in to her and we started at once, getting away before my sister was able to fire off any more pronouncements80 beginning with her favorite words, “Of course.”

An old woman with an immense Breton cap opened the door of The Larches to us. M. Poirot was at home, it seemed.

We were ushered into a little sitting-room arranged with formal precision, and there, after the lapse of a minute or so, my friend of yesterday came to us.

“Monsieur le docteur,” he said, smiling. “Mademoiselle.”

He bowed to Flora.

“Perhaps,” I began, “you have heard of the tragedy which occurred last night.”

His face grew grave.

“But certainly I have heard. It is horrible. I offer mademoiselle all my sympathy. In what way can I serve you?”

“Miss Ackroyd,” I said, “wants you to—to——”

“To find the murderer,” said Flora in a clear voice.

“I see,” said the little man. “But the police will do that, will they not?”

“They might make a mistake,” said Flora. “They are on their way to make a mistake now, I think. Please, M. Poirot, won’t you help us? If—if it is a question of money——”

Poirot held up his hand.

“Not that, I beg of you, mademoiselle. Not that I do not care for money.” His eyes showed a momentary twinkle. “Money, it means much to me and always has done. No, if I go into this, you must understand one81 thing clearly. I shall go through with it to the end. The good dog, he does not leave the scent, remember! You may wish that, after all, you had left it to the local police.”

“I want the truth,” said Flora, looking him straight in the eyes.

“All the truth?”

“All the truth.”

“Then I accept,” said the little man quietly. “And I hope you will not regret those words. Now, tell me all the circumstances.”

“Dr. Sheppard had better tell you,” said Flora. “He knows more than I do.”

Thus enjoined, I plunged into a careful narrative, embodying all the facts I have previously set down. Poirot listened carefully, inserting a question here and there, but for the most part sitting in silence, his eyes on the ceiling.

I brought my story to a close with the departure of the inspector and myself from Fernly Park the previous night.

“And now,” said Flora, as I finished, “tell him all about Ralph.”

I hesitated, but her imperious glance drove me on.

“You went to this inn—this Three Boars—last night on your way home?” asked Poirot, as I brought my tale to a close. “Now exactly why was that?”

I paused a moment to choose my words carefully.

“I thought some one ought to inform the young man of his uncle’s death. It occurred to me after I had left82 Fernly that possibly no one but myself and Mr. Ackroyd were aware that he was staying in the village.”

Poirot nodded.

“Quite so. That was your only motive in going there, eh?”

“That was my only motive,” I said stiffly.

“It was not to—shall we say—reassure yourself about ce jeune homme?”

“Reassure myself?”

“I think, M. le docteur, that you know very well what I mean, though you pretend not to do so. I suggest that it would have been a relief to you if you had found that Captain Paton had been at home all the evening.”

“Not at all,” I said sharply.

The little detective shook his head at me gravely.

“You have not the trust in me of Miss Flora,” he said. “But no matter. What we have to look at is this—Captain Paton is missing, under circumstances which call for an explanation. I will not hide from you that the matter looks grave. Still, it may admit of a perfectly simple explanation.”

“That’s just what I keep saying,” cried Flora eagerly.

Poirot touched no more upon that theme. Instead he suggested an immediate visit to the local police. He thought it better for Flora to return home, and for me to be the one to accompany him there and introduce him to the officer in charge of the case.

We carried out this plan forthwith. We found Inspector Davis outside the police station looking very glum indeed. With him was Colonel Melrose, the Chief Constable,83 and another man whom, from Flora’s description of “weaselly,” I had no difficulty in recognizing as Inspector Raglan from Cranchester.

I know Melrose fairly well, and I introduced Poirot to him and explained the situation. The chief constable was clearly vexed, and Inspector Raglan looked as black as thunder. Davis, however, seemed slightly exhilarated by the sight of his superior officer’s annoyance.

“The case is going to be plain as a pikestaff,” said Raglan. “Not the least need for amateurs to come butting in. You’d think any fool would have seen the way things were last night, and then we shouldn’t have lost twelve hours.”

He directed a vengeful glance at poor Davis, who received it with perfect stolidity.

“Mr. Ackroyd’s family must, of course, do what they see fit,” said Colonel Melrose. “But we cannot have the official investigation hampered in any way. I know M. Poirot’s great reputation, of course,” he added courteously.

“The police can’t advertise themselves, worse luck,” said Raglan.

It was Poirot who saved the situation.

“It is true that I have retired from the world,” he said. “I never intended to take up a case again. Above all things, I have a horror of publicity. I must beg, that in the case of my being able to contribute something to the solution of the mystery, my name may not be mentioned.”

Inspector Raglan’s face lightened a little.

“I’ve heard of some very remarkable successes of yours,” observed the colonel, thawing.

“I have had much experience,” said Poirot quietly. “But most of my successes have been obtained by the aid of the police. I admire enormously your English police. If Inspector Raglan permits me to assist him, I shall be both honored and flattered.”

The inspector’s countenance became still more gracious.

Colonel Melrose drew me aside.

“From all I hear, this little fellow’s done some really remarkable things,” he murmured. “We’re naturally anxious not to have to call in Scotland Yard. Raglan seems very sure of himself, but I’m not quite certain that I agree with him. You see, I—er—know the parties concerned better than he does. This fellow doesn’t seem out after kudos, does he? Would work in with us unobtrusively, eh?”

“To the greater glory of Inspector Raglan,” I said solemnly.

“Well, well,” said Colonel Melrose breezily in a louder voice, “we must put you wise to the latest developments, M. Poirot.”

“I thank you,” said Poirot. “My friend, Dr. Sheppard, said something of the butler being suspected?”

“That’s all bunkum,” said Raglan instantly. “These high-class servants get in such a funk that they act suspiciously for nothing at all.”

“The fingerprints?” I hinted.

“Nothing like Parker’s.” He gave a faint smile, and85 added: “And yours and Mr. Raymond’s don’t fit either, doctor.”

“What about those of Captain Ralph Paton?” asked Poirot quietly.

I felt a secret admiration for the way he took the bull by the horns. I saw a look of respect creep into the inspector’s eye.

“I see you don’t let the grass grow under your feet, Mr. Poirot. It will be a pleasure to work with you, I’m sure. We’re going to take that young gentleman’s fingerprints as soon as we can lay hands upon him.”

“I can’t help thinking you’re mistaken, inspector,” said Colonel Melrose warmly. “I’ve known Ralph Paton from a boy upward. He’d never stoop to murder.”

“Maybe not,” said the inspector tonelessly.

“What have you got against him?” I asked.

“Went out just on nine o’clock last night. Was seen in neighborhood of Fernly Park somewhere about nine-thirty. Not been seen since. Believed to be in serious money difficulties. I’ve got a pair of his shoes here—shoes with rubber studs in them. He had two pairs, almost exactly alike. I’m going up now to compare them with those footmarks. The constable is up there seeing that no one tampers with them.”

“We’ll go at once,” said Colonel Melrose. “You and M. Poirot will accompany us, will you not?”

We assented, and all drove up in the colonel’s car. The inspector was anxious to get at once to the footmarks, and asked to be put down at the lodge. About half-way up the drive, on the right, a path branched off86 which led round to the terrace and the window of Ackroyd’s study.

“Would you like to go with the inspector, M. Poirot?” asked the chief constable, “or would you prefer to examine the study?”

Poirot chose the latter alternative. Parker opened the door to us. His manner was smug and deferential, and he seemed to have recovered from his panic of the night before.

Colonel Melrose took a key from his pocket, and unlocking the door which led into the lobby, he ushered us through into the study.

“Except for the removal of the body, M. Poirot, this room is exactly as it was last night.”

“And the body was found—where?”

As precisely as possible, I described Ackroyd’s position. The arm-chair still stood in front of the fire.

Poirot went and sat down in it.

“The blue letter you speak of, where was it when you left the room?”

“Mr. Ackroyd had laid it down on this little table at his right hand.”

Poirot nodded.

“Except for that, everything was in its place?”

“Yes, I think so.”

“Colonel Melrose, would you be so extremely obliging as to sit down in this chair a minute. I thank you. Now, M. le docteur, will you kindly indicate to me the exact position of the dagger?”

I did so, whilst the little man stood in the doorway.

“The hilt of the dagger was plainly visible from the door then. Both you and Parker could see it at once?”

“Yes.”

Poirot went next to the window.

“The electric light was on, of course, when you discovered the body?” he asked over his shoulder.

I assented, and joined him where he was studying the marks on the window-sill.

“The rubber studs are the same pattern as those in Captain Paton’s shoes,” he said quietly.

Then he came back once more to the middle of the room. His eye traveled round, searching everything in the room with a quick, trained glance.

“Are you a man of good observation, Dr. Sheppard?” he asked at last.

“I think so,” I said, surprised.

“There was a fire in the grate, I see. When you broke the door down and found Mr. Ackroyd dead, how was the fire? Was it low?”

I gave a vexed laugh.

“I—I really can’t say. I didn’t notice. Perhaps Mr. Raymond or Major Blunt——”

The little man opposite me shook his head with a faint smile.

“One must always proceed with method. I made an error of judgment in asking you that question. To each man his own knowledge. You could tell me the details of the patient’s appearance—nothing there would escape you. If I wanted information about the papers on that desk, Mr. Raymond would have noticed anything88 there was to see. To find out about the fire, I must ask the man whose business it is to observe such things. You permit——”

He moved swiftly to the fireplace and rang the bell.

After a lapse of a minute or two Parker appeared.

“The bell rang, sir,” he said hesitatingly.

“Come in, Parker,” said Colonel Melrose. “This gentleman wants to ask you something.”

Parker transferred a respectful attention to Poirot.

“Parker,” said the little man, “when you broke down the door with Dr. Sheppard last night, and found your master dead, what was the state of the fire?”

Parker replied without a pause.

“It had burned very low, sir. It was almost out.”

“Ah!” said Poirot. The exclamation sounded almost triumphant. He went on:—

“Look round you, my good Parker. Is this room exactly as it was then?”

The butler’s eye swept round. It came to rest on the windows.

“The curtains were drawn, sir, and the electric light was on.”

Poirot nodded approval.

“Anything else?”

“Yes, sir, this chair was drawn out a little more.”

He indicated a big grandfather chair to the left of the door between it and the window. I append a plan of the room with the chair in question marked with an X.

“Just show me,” said Poirot.

\

The butler drew the chair in question out a good two feet from the wall, turning it so that the seat faced the door.

Voilà ce qui est curieux,” murmured Poirot. “No one would want to sit in a chair in such a position, I fancy. Now who pushed it back into place again, I wonder? Did you, my friend?”

“No, sir,” said Parker. “I was too upset with seeing the master and all.”

Poirot looked across at me.

“Did you, doctor?”

I shook my head.

“It was back in position when I arrived with the police, sir,” put in Parker. “I’m sure of that.”

“Curious,” said Poirot again.

“Raymond or Blunt must have pushed it back,” I suggested. “Surely it isn’t important?”

“It is completely unimportant,” said Poirot. “That is why it is so interesting,” he added softly.

“Excuse me a minute,” said Colonel Melrose. He left the room with Parker.

“Do you think Parker is speaking the truth?” I asked.

“About the chair, yes. Otherwise I do not know. You will find, M. le docteur, if you have much to do with cases of this kind, that they all resemble each other in one thing.”

“What is that?” I asked curiously.

“Every one concerned in them has something to hide.”

“Have I?” I asked, smiling.

Poirot looked at me attentively.

“I think you have,” he said quietly.

“But——”

“Have you told me everything known to you about this young man Paton?” He smiled as I grew red. “Oh! do not fear. I will not press you. I shall learn it in good time.”

“I wish you’d tell me something of your methods,” I said hastily, to cover my confusion. “The point about the fire, for instance?”

“Oh! that was very simple. You leave Mr. Ackroyd at—ten minutes to nine, was it not?”

“Yes, exactly, I should say.”

“The window is then closed and bolted and the door unlocked. At a quarter past ten when the body is discovered, the door is locked and the window is open.91 Who opened it? Clearly only Mr. Ackroyd himself could have done so, and for one of two reasons. Either because the room became unbearably hot (but since the fire was nearly out and there was a sharp drop in temperature last night, that cannot be the reason), or because he admitted some one that way. And if he admitted some one that way, it must have been some one well known to him, since he had previously shown himself uneasy on the subject of that same window.”

“It sounds very simple,” I said.

“Everything is simple, if you arrange the facts methodically. We are concerned now with the personality of the person who was with him at nine-thirty last night. Everything goes to show that that was the individual admitted by the window, and though Mr. Ackroyd was seen alive later by Miss Flora, we cannot approach a solution of the mystery until we know who that visitor was. The window may have been left open after his departure and so afforded entrance to the murderer, or the same person may have returned a second time. Ah! here is the colonel who returns.”

Colonel Melrose entered with an animated manner.

“That telephone call has been traced at last,” he said. “It did not come from here. It was put through to Dr. Sheppard at 10.15 last night from a public call office at King’s Abbot station. And at 10.23 the night mail leaves for Liverpool.”

\n

:::info About HackerNoon Book Series: We bring you the most important technical, scientific, and insightful public domain books.

This book is part of the public domain. Astounding Stories. (2008). ASTOUNDING STORIES OF SUPER-SCIENCE, JULY 2008. USA. Project Gutenberg. Release date: OCTOBER 2, 2008, from https://www.gutenberg.org/cache/epub/69087/pg69087-images.html

This eBook is for the use of anyone anywhere at no cost and with almost no restrictions whatsoever.  You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org, located at https://www.gutenberg.org/policy/license.html.

:::

\

《TechBeat:医疗保健语音助手实施全指南》(2026年3月22日)

2026-03-22 14:11:17

How are you, hacker? 🪐Want to know what's trending right now?: The Techbeat by HackerNoon has got you covered with fresh content from our trending stories of the day! Set email preference here. ## Feature Selection for Imbalanced Datasets Using Pearson Distance and KL Divergence By @snasibian [ 5 Min read ] A model-free method using statistical distance metrics like Pearson chi-squared and KL divergence to identify important features in highly imbalanced datasets. Read More.

Your User Is Blindfolded and Swinging a Golf Club: Designing for VR

By @laumski [ 7 Min read ] VR makes some really basic things surprisingly hard. This is a practical guide for product designers moving from flat screens into headsets. Read More.

Solo Satoshi Releases the Most Powerful Open-Source Touchscreen Bitcoin Miner

By @solosatoshi [ 6 Min read ] Solo Satoshi releases the Bitaxe Turbo Touch: 2.15 TH/s, fully open-source firmware, and 100% assembled in the USA. Read More.

The Best 9 HR Management Platforms in 2026

By @stevebeyatte [ 13 Min read ] Expert guide to the Best 9 HR Management Platforms in 2026. Compare features, pricing, and best use cases for mid-market companies (200–3,000 employees). Read More.

The Complete OpenClaw Setup Guide: Install, Configure, and Secure Your AI Gateway

By @superorange0707 [ 7 Min read ] Step-by-step guide to installing OpenClaw, connecting messaging platforms, and securing your self-hosted AI agent gateway. Read More.

The Best Medical Speech Recognition Software and APIs in 2026

By @assemblyai [ 11 Min read ] Compare the best medical speech recognition tools in 2026—APIs and software that cut documentation time, reduce burnout, and improve workflows. Read More.

Venture Capital Tilts Toward AI as Non-AI Startups Face Funding Squeeze

By @katiekonyn [ 5 Min read ] AI now dominates VC funding, reshaping startup strategies, inflating valuations, and sidelining non-AI ventures in a high-risk, concentrated market. Read More.

The 5 Best Suits From Marvel's Spider-Man: Miles Morales

By @joseh [ 4 Min read ] The End Suit, Miles Morales 2020, and Into the Spider-Verse are some of the best suits in Marvel's Spider-Man: Miles Morales. Read More.

The Complete Guide to Implementing Healthcare Voice Agents

By @assemblyai [ 7 Min read ] Learn how to build a HIPAA-compliant healthcare voice agent for scheduling, intake, and patient calls using AI, speech recognition, and EHR integration. Read More.

Best Speech to Text APIs to Build an AI Notetaker in 2026

By @assemblyai [ 10 Min read ] This comprehensive guide evaluates the top 8 speech-to-text APIs in 2026. Read More.

C# Barcode Library In-Depth Comparison: Ranked by Use Case

By @ironsoftware [ 34 Min read ] We tested 12 .NET barcode libraries side by side to help you choose the right SDK for scanning, generation, PDFs, and mobile apps. Read More.

Create a Website Without Code: How Fabricate Turns Conversations Into Full-Stack Apps

By @boostlegends1 [ 9 Min read ] Build full-stack web apps without coding. Fabricate uses AI to generate frontend, backend, databases, and payments from simple prompts in minutes. Read More.

MEXC Tops New Listings and Secures #2 with 8.2% Global Spot Market Share

By @mexcmedia [ 2 Min read ] MEXC ranks #2 in global spot trading with 8.2% market share and leads with 1,281 token listings, highlighting strong growth and liquidity. Read More.

A Guide to HIPAA Compliance for Software Development

By @vanta [ 8 Min read ] HIPAA requires organizations to minimize access to protected health information. Read More.

Who the AI Works For

By @thegeneralist [ 7 Min read ] The hierarchy doesn't break when AI arrives. It upgrades. A look at who AI actually works for, through Gibson, Westworld, and the hyperscalers. Read More.

Cursor Your Dream, Part 1: How to Move From Product Idea to First Prompt

By @pavelman [ 32 Min read ] A practical guide for non-technical founders using Cursor and ChatGPT to build real MVPs, choose a stack, and ship faster. Read More.

The Future of Millennial Relationships: How Virtual Intimacy Is Transforming Our Connections

By @socialdiscoverygroup [ 7 Min read ] In an age of constant connectivity, millennials are quietly redefining what intimacy looks like. Read More.

The OpenClaw Saga: How the Last Two Weeks Changed the Agentic AI World Forever

By @thomascherickal [ 22 Min read ] OpenClaw has exposed the biggest issues in the hyperscaler companies, and it is the leader in AI agents. However, it is a security risk. Use local LLMs instead! Read More.

Why Brands Must Adapt to Moment Commerce

By @lomitpatel [ 6 Min read ] Moment commerce is reshaping retail as AI, creators, and content transform how consumers discover and buy products online. Read More.

How to Organize Unit Tests for AI-Generated Code

By @saratmaha [ 5 Min read ] AI writes code faster than you can review it. Here's a structured unit testing method that keeps your codebase trustworthy and easy to maintain. Read More. 🧑‍💻 What happened in your world this week? It's been said that writing can help consolidate technical knowledge, establish credibility, and contribute to emerging community standards. Feeling stuck? We got you covered ⬇️⬇️⬇️ ANSWER THESE GREATEST INTERVIEW QUESTIONS OF ALL TIME We hope you enjoy this worth of free reading material. Feel free to forward this email to a nerdy friend who'll love you for it. See you on Planet Internet! With love, The HackerNoon Team ✌️

基于整数的CFG树计数:您需要了解的内容

2026-03-22 09:00:15

Table of Links

Abstract and 1. Introduction

2. Pairing functions

  1. Enumerating trees
  2. LZ-trees
  3. Conclusion and References

5 Conclusion

This work describes a simple algorithm that enumerates the trees generated by a CFG by forming a bijection between these trees and integers. The key abstraction, an IntegerizedStack, allowed us to encode arbitrary information into a single integer through the use of pairing functions.

References

[1] C. Costa Florencio, J. Daenen, J. Ramon, J. Van den Bussche, and D. Van Dyck, “Naive infinite enumeration of context-free languages in incremental polynomial time,” Journal of Universal Computer Science, vol. 21, no. 7, pp. 891–911, 2015.

\ [2] E. Makinen, “On lexicographic enumeration of regular and context-free languages,” Acta Cybernetica, vol. 13, no. 1, pp. 55–61, 1997.

\ [3] P. Domosi, “Unusual algorithms for lexicographical enumeration,” Acta Cybernetica, vol. 14, no. 3, pp. 461–468, 2000.

\ Figure 3: Enumeration of the grammar in (9) using Algorithm B. Lines only show strings where Algorithm A and Algorithm B give different answers.

\ [4] Y. Dong, “Linear algorithm for lexicographic enumeration of cfg parse trees,” Science in China Series F: Information Sciences, vol. 52, no. 7, pp. 1177–1202, 2009.

\ [5] D. E. Knuth, The Art of Computer Programming, Volume 4, Fascicle 4: Generating All Trees–History of Combinatorial Generation (Art of Computer Programming). AddisonWesley Professional, 2006.

\ [6] I. Semba, “Generation of all the balanced parenthesis strings in lexicographical order,” Information Processing Letters, vol. 12, no. 4, pp. 188–192, 1981.

\ [7] W. Skarbek, “Generating ordered trees,” Theoretical Computer Science, vol. 57, no. 1, pp. 153–159, 1988.

\ [8] S. Zaks, “Lexicographic generation of ordered trees,” Theoretical Computer Science, vol. 10, no. 1, pp. 63–82, 1980.

\ [9] M. Er, “Enumerating ordered trees lexicographically,” The Computer Journal, vol. 28, no. 5, pp. 538–542, 1985.

\ [10] E. Nagel and J. R. Newman, Godel’s proof. Routledge, 2012.

\ [11] R. M. Smullyan, G¨odel’s incompleteness theorems. Oxford University Press on Demand, 1992.

\ [12] G. Cantor, “Ein beitrag zur mannigfaltigkeitslehre,” Journal f¨ur die reine und angewandte Mathematik (Crelles Journal), vol. 1878, no. 84, pp. 242–258, 1878.

\ [13] M. P. Szudzik, “The rosenberg-strong pairing function,” arXiv preprint arXiv:1706.04129, 2017.

\ [14] M. A. Vsemirnov, “Two elementary proofs of the fueter–polya theorem on pairing polynomials,” Algebra i Analiz, vol. 13, no. 5, pp. 1–15, 2001.

\ [15] P. W. Adriaans, “A simple information theoretical proof of the fueter-p\’olya conjecture,” arXiv preprint arXiv:1809.09871, 2018.

\ [16] K. W. Regan, “Minimum-complexity pairing functions,” Journal of Computer and System Sciences, vol. 45, no. 3, pp. 285–295, 1992.

\ [17] A. Rosenberg and H. Strong, “Addressing arrays by shells,” IBM Technical Disclosure Bulletin, vol. 4, pp. 3026–3028, 1972.

\ [18] M. Johnson, T. L. Griffiths, and S. Goldwater, “Adaptor grammars: A framework for specifying compositional nonparametric bayesian models,” in Advances in neural information processing systems, 2007, pp. 641–648.

\ [19] T. J. O’Donnell, Productivity and reuse in language: A theory of linguistic computation and storage. MIT Press, 2015.

\ [20] J. Ziv and A. Lempel, “A universal algorithm for sequential data compression,” IEEE Transactions on information theory, vol. 23, no. 3, pp. 337–343, 1977.

\

:::info Author:

(1) Steven T. Piantadosi.

:::


:::info This paper is available on arxiv under CC BY 4.0 license.

:::

\

菲尼阿斯·费舍尔:保护关键基础设施免受黑客活动分子的侵害

2026-03-22 06:00:33

Table of Links

I. Abstract and Introduction

II. Related Work

III. Mitre ATT&CK

IV. Phineas Fisher

V. Analysis

VI. Conclusion and References

VI. CONCLUSION

As far as the authors are aware this is the first academic analysis of Phineas Fisher, and the first paper to provide a technical analysis of the ‘hacktivist’ threat to critical infrastructure. We have taken a previously unknown threat actor and identified a set of tactics and techniques which may be used to mitigate future attacks. We are in the process of submitting this threat actor into the MITRE ATT&CK (ATT&CK) knowledgebase, which will be available to other researchers and security practitioners. More broadly, research is also needed to detect and prevent such threat actors within the industrial control landscape.

\ A NOTE ON REPRODUCIBILITY

\ All information used in the creation of these models are cited in the main body of the text. Since some of the manifestos were difficult to ascertain we maintain a local copy[4], which includes the individual ATT&CK models as well as the combined model discussed in this manuscript.

\ ACKNOWLEDGEMENTS

\ The authors wish to thank the reviewers for their helpful feedback. We also wish to extend our thanks to the hosts of the Risky Biz podcast (Patrick Gray and Adam Boileau), who provided enlightening reports into Fisher’s exploits and brought Fisher to the authors’ attention.

REFERENCES

[1] ESET, “Industroyer: Biggest threat to industrial control systems since Stuxnet,” p. 17. [Online]. Available: https://www.welivesecurity.com/2017/06/12/industroyer-biggest-threat-industrial-control-systems-since-stuxnet/

\ [2] J. Slowik, “CRASHOVERRIDE: Reassessing the 2016 Ukraine Electric Power Event as a Protection-Focused Attack.” [Online]. Available:

https://dragos.com/resource/crashoverride-reassessing-the-2016-ukraine-electric-power-event-as-a-protection-focused-attack/

\ [3] I. Ghafir, J. Saleem, M. Hammoudeh, H. Faour, V. Prenosil, S. Jaf, S. Jabbar, and T. Baker, “Security threats to critical infrastructure: The human factor,” vol. 74, no. 10, pp. 4986–5002.

\ [4] R. White, “Risk Analysis for Critical Infrastructure Protection,” in Critical Infrastructure Security and Resilience: Theories, Methods, Tools and Technologies, ser. Advanced Sciences and Technologies for Security Applications, D. Gritzalis, M. Theocharidou, and G. Stergiopoulos, Eds. Springer International Publishing, pp. 35–54.

\ [5] P. Fisher. HackBack - A DIY Guide To Rob Banks. [Online]. Available: https://packetstormsecurity.com/files/155392/HackBack-A-DIY-Guide-To-Rob-Banks.html

\ [6] M. Rudner, “Cyber-Threats to Critical National Infrastructure: An Intelligence Challenge,” vol. 26, no. 3, pp. 453–481.

\ [7] K. Stouffer, V. Pillitteri, S. Lightman, M. Abrams, and A. Hahn, “Guide to Industrial Control Systems (ICS) Security.”

\ [8] Department of Homeland Security. DHS warns Anonymous may target critical infrastructure. [Online]. Available: https://web.archive.org/web/20180916124235/http://www.homelandsecuritynewswire.com

\ o[9] O. Yaron, “Hackers Threaten Cyber Attack Against Israel; Mossad, IDF Websites Down.” [Online]. Available: https://www.haaretz.com/1.5207001

\ [10] ICS-CERT, “Incident Response Summary Report (2009-2011),” p. 17. [Online]. Available: https://ics-cert.us-cert.gov/Other-Reports

\ [11] B. E. Strom, J. A. Battaglia, M. S. Kemmerer, W. Kupersanin, D. P. Miller, C. Wampler, S. M. Whitley, and R. D. Wolf, “Finding Cyber Threats with ATT&CK-Based Analytics.” [Online]. Available: https://www.mitre.org/publications/technical-papers/finding-cyber-threats-with-attck-based-analytics

\ [12] B. E. Strom, A. Applebaum, D. P. Miller, K. C. Nickels, A. G. Pennington, and C. B. Thomas, “MITRE ATT&CK : Design and Philosophy.” [Online]. Available: https://www.mitre.org/publications/technical-papers/mitre-attack-design-and-philosophy

\ [13] A. Shostack, Threat Modeling: Designing for Security. Wiley.

\ [14] E. M. Hutchins, M. J. Cloppert, and R. M. Amin, “Intelligence-driven computer network defense informed by analysis of adversary campaigns and intrusion kill chains,” vol. 1, no. 1, p. 80. https://www.vice.com/en_us/article/78kwke/hacker-phineas-fisher-hacking-team-puppet

\ [16] Jeff Larson and Mike Tigas. Leaked Docs Show Spyware Used to Snoop on U.S. Computers. [Online]. Available:

https://www.propublica.org/article/leaked-docs-show-spyware-used-to-snoop-on-u.s.-computers

\ [17] M. Marquis-Boire and B. Marczak. From Bahrain With Love: FinFisher’s Spy Kit Exposed. [Online]. Available: https://citizenlab.ca/2012/07/from-bahrain-with-love-finfishers-spy-kit-exposed/

\ [18] P. Fisher, “Hack Back: A DIY Guide for those without the patience to wait for whistleblowers.”

\ [19] J.M. Porup. How Hacking Team got hacked. [Online]. Available: https://arstechnica.com/information-technology/2016/04/how-hacking-team-got-hacked-phineas-phisher/

\ [20] L. Franceschi-Bicchierai. The Vigilante Who Hacked Hacking Team Explains How He Did It. [Online]. Available: https://www.vice.com/en_us/article/3dad3n/the-vigilante-who-hacked-hacking-team-explains-how-he-did-it

\ [21] P. Fisher. HackBack - A DIY Guide (HackingTeam). [Online]. Available: https://www.exploit-db.com/exploits/41915

\ [22] Collective. HackBack! Talking with Phineas Fisher: Hacking as Direct Action against the Surveillance State. [Online]. Available: https://crimethinc.com/2018/06/05/hackback-talking-with-phineas-fisher-hacking-as-direct-action-against-the-surveillance-state

\ [23] A. Greenberg, “WikiLeaks Dumps ’Erdogan Emails’ After Turkey’s Failed Coup.” [Online]. Available: https://www.wired.com/2016/07/wikileaks-dumps-erdogan-emails-turkeys-failed-coup/

\ [24] Emma Best. Renowned hacker and former WikiLeaks source Phineas Fisher says organization misled people about their files Emma Best. [Online]. Available: https://emma.best/2019/07/18/hacker-wikileaks-source-phineas-fisher-says-organization

\ [25] L. Franceschi-Bicchierai. Hacking Team Hacker Phineas Fisher Is Taking a Break Because of Stress. [Online]. Available: https://www.vice.com/en_us/article/xy5enw/hacking-teams-phineas-fisher-will-return-but-only-after-a-break-at-the-beach

\ [26] ——. Phineas Fisher Offers $100,000 Bounty to Hack Banks and Oil Companies. [Online]. Available: https://www.vice.com/en us/article/vb5agy/phineas-fisher-offers-dollar100000-bounty-for-hacks-against-banks-and-oil-companies

\ [27] J. Cox. Offshore Bank Targeted by Phineas Fisher Confirms It Was Hacked. [Online]. Available: https://www.vice.com/en ca/article/ne8p9b/offshore-bank-targeted-phineas-fisher-confirms-hack-cayman-national-bank

\ [28] L. Franceschi-Bicchierai. Hacking Team Hacker Phineas Fisher Has Gotten Away With It. [Online]. Available: https://www.vice.com/en us/article/3k9zzk/hacking-team-hacker-phineas-fisher-has-gotten-away-with-it

\ [29] ——. Vigilante Hacker Phineas Fisher Denies Working for the Russian Government. [Online]. Available: https://www.vice.com/en ca/article/qv7y8m/vigilante-hacker-phineas-fisher-denies-working-for-the-russian-government

\ [30] P. Maynard, K. McLaughlin, and S. Sezer, “Modelling Duqu 2.0 Malware using Attack Trees with Sequential Conjunction,” in 2nd International Conference on Information Systems Security and Privacy.

\

:::info Authors:

(1) Peter Maynard, Centre for Secure Information Technology, Queen’s University Belfast, UK ([email protected]);

(2) Kieran McLaughlin, Centre for Secure Information Technology, Queen’s University Belfast, UK ([email protected]).

:::


:::info This paper is available on arxiv under CC0 1.0 license.

:::

[4] https://github.com/PMaynard/Viva-Phineas-Fisher

《如何在 Node 和 Go 中开发并对比同一功能》指南

2026-03-22 04:00:38

When I started building chaos-proxy, the initial goal was simple: make API chaos testing practical for JavaScript and TypeScript teams. I wanted something that could sit between an app and its upstream API and introduce realistic turbulence on demand: latency spikes, intermittent failures, and other behavior that makes integration tests feel closer to production.

\ Node.js was the obvious first runtime for that because the ecosystem, tooling, and middleware ergonomics are excellent for rapid iteration. It is hard to overstate how productive that setup is when the main audience is already living in npm, TypeScript, and JavaScript test runners.

\ Later, I rewrote the same proxy in Go to push raw proxy performance further and support higher throughput under load. The intent was not to replace one with the other philosophically, but to explore a different optimization frontier with the same product idea.

\ This post documents what happened when I implemented the same non-trivial feature in both runtimes: hot config reload. Then I reran the benchmark from my previous article to see how the newer versions compare.

\ The interesting part is not only the final numbers. It is also how two mature runtimes guide you toward different internal designs, even when you are enforcing the same external behavior contract.

\ Old benchmark post: \n https://blog.gaborkoos.com/posts/2025-10-11-Nodejs-vs-Go-in_Practice-Performance-Comparison-of-chaos-proxy-And-chaos-proxy-go/

\ Repositories:

Implementing Hot Config Reload in Two Runtimes

The goal of hot config reload was to allow users to update the proxy's behavior without downtime. This means that when a new config is posted to the /reload endpoint, the proxy should parse, validate, and apply the new configuration atomically, without interrupting in-flight requests. This enables advanced testing scenarios where you can change the chaos behavior on the fly to model dynamic production conditions like feature rollouts, traffic shifts, or evolving failure modes.

\ Both implementations follow the same external contract:

  • POST /reload accepts a full config snapshot
  • Parse -> validate -> build -> swap, all-or-nothing
  • Deterministic in-flight behavior (request-start snapshot semantics)
  • Reject concurrent reload requests
  • Consistent status model (400, 409, 415, success returns version, and reload duration)

\ So, the user-facing behavior is aligned. Clients see the same API and guarantees. The internal shape is where Node and Go felt very different.

Runtime Model

Node leaned toward a dynamic runtime object: rebuild middleware/router chain, then swap the active runtime. That style maps naturally to the way Node applications are often composed. Rebuilds are straightforward to express, and the overall control flow stays compact.

\ Go leaned toward immutable runtime snapshots: config + router + version behind an atomic pointer. In practice, this makes the runtime feel more explicit. You can point to exactly what a request observed and exactly when a new version became active.

Concurrency Model

In Node, most complexity is around making reload writes serialized and safe while requests continue flowing.

\ In Go, the read/write split is explicit: request path loads one snapshot at request start, reload path builds fresh state under lock, then atomically swaps.

\ Behaviorally, both approaches are equivalent from a user perspective. The difference is mostly in how obvious the invariants are when you revisit the code weeks later.

In-flight Guarantees

Both versions guarantee request-start snapshot semantics.

\ In Node, this is easier to accidentally violate if mutable shared state leaks into request handling.

\ In Go, the pointer-load-at-entry pattern makes this guarantee structurally harder to violate.

\ That was one of the strongest practical contrasts for me: same requirement, different default safety profile.

Router Lifecycle and Rebuild Mechanics

Node composition is lightweight and ergonomic for rebuilds.

\ Go rebuilds a fresh router and re-registers middleware/routes on each reload. Behavior is explicit and predictable at the snapshot level, with middleware execution order deterministic only when config uses ordered list elements (not multiple keys in one map). It can look verbose at first, but this explicitness pays off when debugging edge cases around reload timing.

Validation and Rollback Boundaries

Both use the same pipeline: parse -> validate -> build -> swap.

\ Node gives more dynamic flexibility but needs stricter guard discipline.

\ Go's type-driven pipeline made failure paths and rollback behavior cleaner to reason about.

\ In both runtimes, treating build and swap as separate phases was the key to keeping rollback semantics simple.

Stateful Middleware Behavior

Both implementations rebuild middleware instances on reload. That means in-memory middleware state (for example, counters or local token buckets) resets by design after a successful reload. This is intentional and worth calling out to users because it is product behavior, not an implementation accident.

Benchmark Rerun

After adding hot config reload support, I reran the old benchmark setup.

\ The goal here was not to produce an absolute, universal number for every environment. The goal was to keep the methodology stable enough to compare the old and new versions and see whether the relative shape changed.

System and Test Environment (Same Machine as the Old Article)

This rerun was executed on the same machine as the benchmark in the previous article, with the same local topology (Caddy backend on localhost, proxy on localhost, load generated by hey on the same host).

\ Machine characteristics:

  • CPU: AMD Ryzen 7 5800H with Radeon Graphics
  • Cores/Threads: 8 cores / 16 threads
  • Base clock: 3.2 GHz
  • RAM: 16 GB DDR4
  • OS: Windows 10 Home 22H2 64-bit

\ Benchmark setup characteristics:

  • Backend: Caddy serving /api/hello on localhost:8080
  • Proxy target: localhost:5000
  • Load generator: hey
  • Command pattern: hey -n 1000 -c 50 http://localhost:/api/hello
  • Runs per scenario: 3 (median reported)

\ Reproducibility command block (same pattern used for this article):

# 1) Start Caddy backend
./caddy.exe run --config Caddyfile

# 2) Baseline (direct Caddy)
for i in 1 2 3; do ./hey -n 1000 -c 50 http://localhost:8080/api/hello | tee -a baseline-caddy-runs.txt; done

# 3) Node proxy benchmark (in another terminal, start proxy first)
npx chaos-proxy --config chaos.yaml
for i in 1 2 3; do ./hey -n 1000 -c 50 http://localhost:5000/api/hello | tee -a node-3.0.1-runs.txt; done

# Stop the Node proxy process before running the Go proxy benchmark (both use port 5000)

# 4) Go proxy benchmark (in another terminal, start proxy first)
./chaos-proxy-go.exe --config chaos.yaml
for i in 1 2 3; do ./hey -n 1000 -c 50 http://localhost:5000/api/hello | tee -a go-0.2.1-runs.txt; done

Versions in this rerun:

  • chaos-proxy (Node): 3.0.1
  • chaos-proxy-go (Go): 0.2.1

\ I also verified response-size parity for fairness:

  • Caddy: 94 bytes/request
  • Node 3.0.1: 94 bytes/request
  • Go 0.2.1: 94 bytes/request

\ This check mattered because an earlier Node run returned compacted JSON (smaller payload), which could bias throughput. The final numbers below use matched response sizes.

Current Rerun (Median of 3)

| Scenario | Requests/sec | Avg Latency (s) | P99 Latency (s) | |----|----|----|----| | Direct Caddy | 24,912.1845 | 0.0018 | 0.0156 | | chaos-proxy Node 3.0.1 | 3,788.0065 | 0.0129 | 0.0318 | | chaos-proxy-go 0.2.1 | 7,286.8293 | 0.0062 | 0.0248 |

Old Benchmark Reference (from previous post)

| Scenario | Requests/sec | Avg Latency (s) | P99 Latency (s) | |----|----|----|----| | Direct Caddy | 28,383.8519 | 0.0016 | 0.0116 | | chaos-proxy Node 2.0.0 | 4,262.3420 | 0.0115 | 0.0417 | | chaos-proxy-go 0.0.5 | 8,828.0577 | 0.0053 | 0.0140 |

What Changed?

  1. Go vs Node in current versions
  • Go is still clearly ahead.
  • Throughput: Go is about 1.92x higher than Node (7286.8 vs 3788.0 req/sec).
  • Average latency: Node is about 2.08x slower than Go (0.0129s vs 0.0062s).
  1. Go old vs Go new
  • Throughput decreased from 8828.1 to 7286.8 req/sec (~17.5% lower).
  • Average latency increased from 0.0053s to 0.0062s (~17.0% higher).
  • P99 increased from 0.0140s to 0.0248s.
  1. Node old vs Node new
  • Throughput decreased from 4262.3 to 3788.0 req/sec (~11.1% lower).
  • Average latency increased from 0.0115s to 0.0129s (~12.2% higher).
  • P99 improved from 0.0417s to 0.0318s.

\ Adding hot-reload-safe runtime mechanics introduces measurable overhead even in steady-state forwarding paths, which is why both implementations are slower than their previous versions in this benchmark shape.

\ I did not trigger reloads during benchmark traffic, so this should be interpreted as structural overhead from the runtime architecture needed to guarantee safe reload semantics, not reload execution cost itself.

Why There Is Overhead Even Without Calling/reload

Even if reload is never triggered during the benchmark request stream, the hot reload feature still changes the steady-state architecture:

  • Requests now run through runtime indirection designed for safe snapshot semantics.
  • Runtime objects and routing/middleware composition are organized around swap-ready boundaries.
  • Concurrency guards and state-boundary discipline are now part of the normal request path design.

\ In other words, the cost is not from running/reloading repeatedly during the test. The cost comes from maintaining reload-safe invariants all the time.

Conclusion

Implementing the same feature in Node and Go was one of the most useful engineering exercises I have done in a while.

\ The final behavior contract can be identical across runtimes, but the implementation pressure points are very different:

  • Node emphasizes dynamic composition and careful mutation control.
  • Go emphasizes snapshot immutability and explicit concurrency boundaries.

\ Performance-wise, the high-level outcome still holds: the Go proxy remains roughly 2x faster than the Node proxy in this benchmark shape. At the same time, both implementations are now better specified in terms of live reconfiguration semantics, which was the actual feature goal. The implementations are likely not fully performance-tuned yet. For now, that trade-off is acceptable for the feature guarantees we wanted.

\ And yes, it was genuinely fun to build.