WEBVTT

1
00:00:01.080 --> 00:00:04.799
How'd you like to listen to dot
net rocks with no ads? Easy?

2
00:00:05.360 --> 00:00:09.480
Become a patron for just five dollars
a month. You get access to a

3
00:00:09.480 --> 00:00:14.240
private RSS feed where all the shows
have no ads. Twenty dollars a month.

4
00:00:14.279 --> 00:00:18.440
We'll get you that and a special
dot net Rocks patron mug. Sign

5
00:00:18.519 --> 00:00:35.560
up now at Patreon dot dot NetRocks
dot com. Hey guess what, it's

6
00:00:35.560 --> 00:00:39.000
dot net rocks. I'm Carl Franklin, an amateur cable We just had a

7
00:00:39.039 --> 00:00:46.000
conversation before SERGEI came online about phishing, and because I was watching the show

8
00:00:46.039 --> 00:00:50.240
called Bizarre Foods America with Andrew Zimmern. It's an old show, right,

9
00:00:50.280 --> 00:00:53.920
it's been on many years, but
I love watching reruns of things that are

10
00:00:53.960 --> 00:00:56.560
interesting. And he was in Vancouver. Yeah, yeah, and he goes

11
00:00:56.600 --> 00:01:00.280
to tojo like the guy who invented
the californiyear old and I got you there,

12
00:01:00.479 --> 00:01:04.799
right, yes you did? Yeah, And Aerosmith walked in right yeah,

13
00:01:04.879 --> 00:01:07.840
right while we were there. That's
right, you did that over the

14
00:01:07.840 --> 00:01:11.599
shoulder shot. Yeah. And my
friend said, hey, who's that guy

15
00:01:11.680 --> 00:01:17.680
talking to my aunt? Edna?
Steven Tyler. Steven Tyler has aged interestingly

16
00:01:17.799 --> 00:01:26.120
dude looks like a grandma. Now. Anyway, that was a fun conversation,

17
00:01:26.159 --> 00:01:29.719
but that's not what we're here for. Let's get into better no framework

18
00:01:29.760 --> 00:01:38.599
and start this thing. All right, man, what do you got?

19
00:01:38.680 --> 00:01:45.439
All right? I found this list, a curated list of awesome open source

20
00:01:45.719 --> 00:01:51.920
projects on the web, and it's
called awesome oss. It's a GitHub repo

21
00:01:52.120 --> 00:01:56.079
and it's at Serene Blue. And
I love these curated lists, and man,

22
00:01:56.120 --> 00:02:00.640
I wish we had these more in
every category of life, like music

23
00:02:00.719 --> 00:02:05.519
for example. You know, used
to have an uncle who had a record

24
00:02:05.560 --> 00:02:09.080
collection who you could just go to
and say, hey, what's really cool

25
00:02:09.159 --> 00:02:13.360
right now? And they would say
I love this yeah, and you listen

26
00:02:13.439 --> 00:02:17.840
to it and it's great. So
developer tools is just one of the categories

27
00:02:17.840 --> 00:02:23.000
in here. But the categories are
there's only a few audio editors, audio

28
00:02:23.039 --> 00:02:29.800
players, documents, developer tools,
email foundations, FTP clients, games,

29
00:02:29.879 --> 00:02:35.599
graphics, multimedia, networking, OS
distributions, other password managers, payments,

30
00:02:35.639 --> 00:02:38.919
social text editors, video software,
web browsers. I went looking in you

31
00:02:38.960 --> 00:02:44.039
know, non developer tool stuff,
sure, and there's so many cool projects

32
00:02:44.080 --> 00:02:47.039
that I had no idea. The
curation he's done here where he's actually found

33
00:02:47.120 --> 00:02:51.319
the links for how you donate as
well as how you contribute, Like,

34
00:02:51.879 --> 00:02:53.879
this is a ton of work to
make this list. A lot of work.

35
00:02:54.000 --> 00:02:58.560
Yeah, yeah, no, I
really appreciate that. Yeah. I

36
00:02:58.599 --> 00:03:01.159
didn't see anything where you could donate
to him. No, no, not

37
00:03:01.319 --> 00:03:04.560
it all. But I think that's
what this is about. I mean,

38
00:03:04.599 --> 00:03:06.960
in the end, I mean,
they're still maintaining it. But this is

39
00:03:06.960 --> 00:03:10.240
a properly configured open source project too, right. I appreciate that it has

40
00:03:10.280 --> 00:03:16.159
an MIT license. That's great.
It's kind of funny. But yeah,

41
00:03:16.199 --> 00:03:21.240
they to do the work of saying
here's the project, here's the source cover

42
00:03:21.280 --> 00:03:23.520
repositor. If you want to contribute
code, here's how they take donations,

43
00:03:23.560 --> 00:03:27.560
if you want to contribute money.
It's really awesome, that's really great.

44
00:03:27.719 --> 00:03:31.960
Yeah, so hats off to Serene
Blue for curating that list. Who's talking

45
00:03:32.000 --> 00:03:36.919
to us? Richard grabbed a comment
off of show eighteen eighty, which was

46
00:03:37.000 --> 00:03:38.680
just a couple of weeks ago,
right, yeah, right, which is

47
00:03:38.719 --> 00:03:42.800
why we're here actually, because when
we were recording that show with Jimmy Bogart

48
00:03:42.840 --> 00:03:46.000
about migrating to dot net eight he
called out hang fire. Yeah, and

49
00:03:47.000 --> 00:03:50.159
and right away I made a notice. I'm going to go look up what

50
00:03:50.199 --> 00:03:53.719
hangfires. I hadn't heard about it
before, but one of our long time

51
00:03:53.759 --> 00:03:55.840
listeners, Dave Ackkroyd, also immediately
commented on that show. He said,

52
00:03:55.879 --> 00:04:00.240
this is a great episode. I'll
be recommending my colleagues listen, though they

53
00:04:00.240 --> 00:04:01.840
should be listening to all of them
anyway. Uh, and I'm not.

54
00:04:01.919 --> 00:04:04.520
That's not an editorial. I mean, that's what Dave said. That's why

55
00:04:04.560 --> 00:04:09.840
we love Dave. I had my
ears prick up the moment when Jimmy mentioned

56
00:04:09.919 --> 00:04:13.199
hang fire, as that is a
service I work with a lot on my

57
00:04:13.280 --> 00:04:16.360
current job. I would love to
hear from them, especially as I'm currently

58
00:04:16.399 --> 00:04:19.759
using it on dot Net framework and
looking to the dot Net Core. Would

59
00:04:19.800 --> 00:04:25.160
open up some other hosting options besides
an EC two instance running on Windows server

60
00:04:26.800 --> 00:04:29.600
or running Windows Server on EC two
instance. That sounds right. I like

61
00:04:29.639 --> 00:04:33.680
that better. My ideal world would
have no i as, and so knowing

62
00:04:33.720 --> 00:04:38.279
some more around options for platform as
of service would be great to hear.

63
00:04:38.839 --> 00:04:41.560
Sorry, Dave, Yeah, we
can't help you. No, Nope,

64
00:04:41.680 --> 00:04:44.160
not that they could do there.
We're not going to go there, not

65
00:04:44.199 --> 00:04:49.360
gonna do it and come, you
know. Fortunately, in my initial research,

66
00:04:49.439 --> 00:04:54.240
and seeing the encouragement from David so
Forth, I reached out to Sergey,

67
00:04:54.360 --> 00:04:57.800
who was very responsive to us,
and so here we are just a

68
00:04:57.800 --> 00:05:01.639
few weeks later. Very cool.
I know you got a copy of us

69
00:05:01.680 --> 00:05:03.920
iccode by already. I think you
got all the things one way or the

70
00:05:03.920 --> 00:05:08.120
other. But pick me later and
we'll chat. Thanks so much for your

71
00:05:08.120 --> 00:05:10.120
comment and a copy of music,
cob By. It's on its way to

72
00:05:10.160 --> 00:05:12.519
you. And if you'd like a
copy of musicobe I write a comment on

73
00:05:12.519 --> 00:05:15.800
the website at Donna at rocks dot
com or on the social media's like Facebook,

74
00:05:15.000 --> 00:05:17.120
publish every show there, and if
you comment there and are reading the

75
00:05:17.120 --> 00:05:19.639
show, we'll send you copy of
music kobay and you can follow us on

76
00:05:19.680 --> 00:05:23.680
Twitter if you want, or x
or whatever they call it. I'm at

77
00:05:23.680 --> 00:05:27.160
Carl Franklin, he's at Rich Campbell, but the cool kids are hanging out.

78
00:05:27.199 --> 00:05:30.439
I'm Masterson. I'm at Carl Franklin
at tech cub dot social, and

79
00:05:30.560 --> 00:05:34.279
I'm Rich Campbell at Macedon dot social. Send us a tuote. We will

80
00:05:34.279 --> 00:05:38.079
definitely read it. That's all we're
committing to. Yeah, that's all.

81
00:05:38.720 --> 00:05:41.639
Quietly, we might make fun of
it, yeah, but publicly we always

82
00:05:41.680 --> 00:05:46.279
say nice things. We're nice guys, at least on a podcast. We

83
00:05:46.319 --> 00:05:49.079
are. Yeah, that's right,
we play nice guys on a podcast.

84
00:05:49.120 --> 00:05:56.639
Okay, close enough, let's bring
on. Odie Knockoff is a proud husband

85
00:05:56.639 --> 00:06:00.319
and father of two kids, currently
living in Thailand. He's been in offerare

86
00:06:00.319 --> 00:06:04.279
development for more than fifteen years,
looking to find the exact reason why concurrent

87
00:06:04.560 --> 00:06:11.079
parallel distributed programming is so difficult.
I hope he's hearing it enlighten us.

88
00:06:11.079 --> 00:06:14.560
I know he will. Welcome serge. Hi, everyone, how are you

89
00:06:14.639 --> 00:06:18.439
doing? Thank you for the invitation. I'm doing fine, but my bed

90
00:06:18.600 --> 00:06:24.720
is tired. Yeah. Yeah,
this is a very much around the world

91
00:06:24.800 --> 00:06:29.240
recording. You're in Thailand, I'm
in BC Carls, Connecticut. Like we're

92
00:06:29.240 --> 00:06:31.759
covering all the time zones. Yep. This is amazing that we can all

93
00:06:31.800 --> 00:06:36.959
be here together on riverside. But
let's talk about hang fire now. I'm

94
00:06:38.000 --> 00:06:41.000
just going to give the quick you
know, read what the website says.

95
00:06:41.000 --> 00:06:45.399
It's very easy to understand. An
easy way to perform background processing in dot

96
00:06:45.480 --> 00:06:50.800
net and dot net core applications.
No Windows service or separate process required,

97
00:06:51.240 --> 00:06:57.519
backed by persistent storage, open and
free for commercial use. Wow, legit,

98
00:06:57.680 --> 00:07:01.600
that's and that's quite an undertaking.
My friend and colleague Brian McKay,

99
00:07:02.000 --> 00:07:04.759
when I told him we were interviewing
you, said, holy crap. We

100
00:07:04.839 --> 00:07:09.360
used to use hang fireback in the
dot net framework days and he had no

101
00:07:09.480 --> 00:07:15.199
idea that you could run it encore. Oh yes you can. So it

102
00:07:15.399 --> 00:07:19.839
centers around this idea of jobs,
and you have just right on the homepage,

103
00:07:19.839 --> 00:07:24.519
you know, examples of what the
different kinds of jobs are, fire

104
00:07:24.560 --> 00:07:30.920
and forget, delayed jobs executed only
once, but not immediately after a certain

105
00:07:30.959 --> 00:07:35.399
time interval, recurring jobs like on
the specified Crawn schedule. So wow,

106
00:07:36.040 --> 00:07:42.360
that's great. Continuations which are executed
when its parent job has been finished.

107
00:07:43.040 --> 00:07:46.519
And then the pro version has this
thing about batches. We'll get into that

108
00:07:46.079 --> 00:07:50.759
a little bit later. But man, this looks great and so necessary and

109
00:07:50.839 --> 00:07:58.480
so easy. Thank you. How
long you been doing this now more than

110
00:07:58.560 --> 00:08:03.959
ten years already, Guinness. It
will be eleven birthday this year in August,

111
00:08:05.279 --> 00:08:11.959
as I remember, I started it
in twenty thirteen. First commit it

112
00:08:11.120 --> 00:08:16.319
was in another life. What was
your inspiration? I mean, did you

113
00:08:16.399 --> 00:08:18.959
have like a problem that you said, you know, I need something like

114
00:08:20.000 --> 00:08:26.160
this so you wrote it for yourself
or well that My problem was I found

115
00:08:26.199 --> 00:08:35.480
myself implemented the same beats from project
to project on my jobs. So I

116
00:08:35.559 --> 00:08:43.279
waited for a long time that another
one more experienced developer implement these. I

117
00:08:43.320 --> 00:08:50.320
was waiting for about four years,
but I saw almost nothing. Most project

118
00:08:50.759 --> 00:08:56.120
or dead because the period, and
after a year or two it became up

119
00:08:56.320 --> 00:09:00.000
torment. So you have that healthy
instinct of this is such a good idea,

120
00:09:00.120 --> 00:09:03.200
somebody else must have already done this. Yes, yes, yes,

121
00:09:03.919 --> 00:09:09.799
I was looking on other platforms like
ururban rails, like Python. I saw

122
00:09:09.919 --> 00:09:16.480
Sidekik, Cillary and other interesting projects, and I was dreaming that someone will

123
00:09:16.519 --> 00:09:24.120
implement this because I really tired implementing
the same and the same on dark Night

124
00:09:24.120 --> 00:09:28.879
platform. Yeah so you I mean
you mentioned Celery and that's built for a

125
00:09:30.279 --> 00:09:33.960
what platform is that for? It's
Python. It's a Python, That's what

126
00:09:33.960 --> 00:09:39.679
I was thinking. Do you see
that as an inspiration? Like that's just

127
00:09:39.720 --> 00:09:46.080
a give me one of those that
please, just just just top level.

128
00:09:46.360 --> 00:09:52.519
I didn't go into the details.
I was looking at API was dreaming,

129
00:09:52.440 --> 00:09:56.399
right, yeah, yeah, yeah, I just hoping that you know,

130
00:09:58.559 --> 00:10:01.480
you don't want to have to happily
use somebody else's if you could have.

131
00:10:01.799 --> 00:10:07.519
Yes, yes, sure, because
the ground jobs today projects are more complex

132
00:10:07.639 --> 00:10:11.840
than in the early days of the
internet, and almost every project I need

133
00:10:11.919 --> 00:10:18.399
some kind of ground processing. I
was surprised to see that there is no

134
00:10:18.679 --> 00:10:24.799
movement in the network. I saw
some projects. That's what that already as

135
00:10:24.840 --> 00:10:31.639
I already mentioned, because it's difficult
to be to build a sustainable open source

136
00:10:31.720 --> 00:10:39.120
projects. So that's but I think
that's another story. No, but,

137
00:10:39.279 --> 00:10:43.720
and I when it's super relevant on
the show that you know how you built

138
00:10:43.720 --> 00:10:48.600
this out of your own need,
but you've got a huge raft of contributors

139
00:10:48.600 --> 00:10:52.200
too, so obviously with a need
by other folks that they've helped you out

140
00:10:52.360 --> 00:10:56.440
or been a part of the process. Yeah, sure, because contributors published

141
00:10:58.200 --> 00:11:01.919
a huge number of things. Because
sometimes you don't have time to fix some

142
00:11:03.279 --> 00:11:11.519
rare features or very rare use cases, and contributors make a huge contributions help

143
00:11:11.600 --> 00:11:16.960
a lot you polish some advancity use
cases. I noticed that you have an

144
00:11:18.039 --> 00:11:22.720
architectural diagram which is very helpful,
but it has like the user and then

145
00:11:22.840 --> 00:11:30.440
the hang fired scheduler and then a
server. But as you mentioned in the

146
00:11:30.559 --> 00:11:33.799
very first paragraph on your website.
You don't have to go out of process.

147
00:11:35.279 --> 00:11:39.480
This is just a you know,
a logical server, if you will,

148
00:11:39.559 --> 00:11:43.720
right, logical server. Yeah,
yeah, yeah, But you can

149
00:11:43.799 --> 00:11:46.840
move it out of process if you
want to, right. Yes. You

150
00:11:46.879 --> 00:11:52.720
can start in the same process to
keep things simple and later move it out

151
00:11:52.919 --> 00:11:58.440
to another process or another server when
needed. And the main things is that

152
00:11:58.720 --> 00:12:03.720
you're the top will not be complicated
when you do this because in both casse,

153
00:12:05.039 --> 00:12:09.240
if you perform the process in the
same process and in another process you're

154
00:12:09.320 --> 00:12:15.480
using the same configuration, you just
plug in the storage and let hunfar do

155
00:12:15.960 --> 00:12:20.559
right. So you don't need any
kind of inter process communication because it's all

156
00:12:20.600 --> 00:12:24.240
persisting in a database. Yeah.
Yeah, that's very cool. Yeah.

157
00:12:24.480 --> 00:12:28.919
And by database it looks like you
mean just about anything the process I suspect

158
00:12:28.960 --> 00:12:31.080
I could probably drop the state information
into a file and you could pick it

159
00:12:31.120 --> 00:12:35.600
back up and keep going. Not
quite, because official is supported a skill

160
00:12:35.759 --> 00:12:43.559
server and already and in memory for
simplified development, et cetera. But there

161
00:12:43.559 --> 00:12:50.399
are a lot of community by the
storages that are implemented by other people,

162
00:12:50.840 --> 00:12:58.480
other contributors, so I don't think
it's easy to use file lists but it

163
00:12:58.480 --> 00:13:05.759
can be at least implemented. Sure. So when I was talking to Brian

164
00:13:05.840 --> 00:13:11.240
McKay, he wanted to know when
is a good time to use hang Fire

165
00:13:11.519 --> 00:13:18.720
versus some sort of cloud service you
know, Azure Functions or service Bus,

166
00:13:18.320 --> 00:13:22.799
because he says, we use that
pattern a lot. I think it depends

167
00:13:22.840 --> 00:13:30.960
on architecture because there are companies that
invest heavily in cloud infrastructure and I don't

168
00:13:31.000 --> 00:13:35.000
think I don't think there is need
to move to Fire or other on promise

169
00:13:35.080 --> 00:13:41.879
things for them, but it is
still possible. Nowadays, company looks for

170
00:13:41.080 --> 00:13:48.000
ways to keep it possible to move
to other vendors. Right. Platform independence,

171
00:13:48.720 --> 00:13:52.759
yes, yes, yes, And
it's difficult if you invest a lot

172
00:13:52.799 --> 00:13:58.559
of time, a lot of development
into one concrete platform to move switch to

173
00:14:00.159 --> 00:14:05.879
another one. So if a company
wants to invest more in a platform independence,

174
00:14:07.159 --> 00:14:13.559
then it's a great opportunity to use
Fire. I imagine that when it

175
00:14:13.600 --> 00:14:20.559
comes to scaling, right, your
database might be the the you know,

176
00:14:20.600 --> 00:14:24.600
the point at which you want to
put your resources into. You know,

177
00:14:24.720 --> 00:14:30.919
it might be the bottleneck. Can
you use just standard caching? Is that

178
00:14:30.960 --> 00:14:33.399
going to screw up the whole process? If we I mean, I mean

179
00:14:33.440 --> 00:14:39.039
it's really true. It's really about
writing to the database. But there's obviously

180
00:14:39.039 --> 00:14:43.399
your services in the background are reading
that database. And if you cash,

181
00:14:45.159 --> 00:14:48.200
is there a possibility that something will
be missed? How do you feel about

182
00:14:48.200 --> 00:14:56.000
that. It's possible to use different
databases for applications, data and for and

183
00:14:56.120 --> 00:15:01.480
far and fire has a right heavy
workloads, so it's difficult to catch anything

184
00:15:01.639 --> 00:15:09.000
there because everything is constantly changed,
like the ground jobs that move from one

185
00:15:09.080 --> 00:15:15.159
state to another. So whattlelike is
an interesting problem and I'm afraid there is

186
00:15:15.240 --> 00:15:22.320
no solution of them charging. Yeah. Yeah, you can use multiple storages

187
00:15:22.519 --> 00:15:28.559
incanfi and create the ground jobs in
one or another storage. So on the

188
00:15:28.600 --> 00:15:33.639
server aspect, you know, the
thing that reads the database in fires off

189
00:15:33.679 --> 00:15:41.279
the jobs and all that stuff is
there in memory. Cash with notification that

190
00:15:41.320 --> 00:15:46.240
the database has changed for you,
so that you're not constantly polling the database.

191
00:15:46.279 --> 00:15:48.840
How does that work? It depends
on the storage because, for example,

192
00:15:50.360 --> 00:15:56.320
Alreadius has blocking commands. But actually
that's why people love radis. Yeah

193
00:15:56.399 --> 00:16:00.600
yeah, but actually the most popular
client for red this is stach exchange rate

194
00:16:02.039 --> 00:16:08.759
doesn't support blocking comments. So this
is a kind of pops up magic punitions.

195
00:16:10.240 --> 00:16:15.720
And subscribe. I'm talking about a
squall server. It has some motification

196
00:16:15.039 --> 00:16:21.600
about Historically it's complicated, right,
you have to do triggers and things,

197
00:16:21.679 --> 00:16:27.919
right, dependency. I even forgot
the name of it. There. Once

198
00:16:29.000 --> 00:16:33.200
upon a time seql server had notification
services. Yeah, yeah, yeah,

199
00:16:33.279 --> 00:16:37.240
yeah, yeah yeah. And to
simplify things, I will I was trying

200
00:16:37.279 --> 00:16:44.480
to discover a more or less efficient
way of pulling and let's versions. It

201
00:16:44.600 --> 00:16:51.399
has central bags, but it works, it works well practically, so very

202
00:16:51.399 --> 00:16:53.440
good. Yeah. And I noticed
that you start with sql server two thousand

203
00:16:53.480 --> 00:16:56.960
and eight R two. It's like
the base model, and that's the original

204
00:16:56.080 --> 00:17:00.080
version for notification services, as I
recall. Isn't that funny? Yeah,

205
00:17:00.120 --> 00:17:07.720
but they require additional loanments, additional
database configuration, and right in the early

206
00:17:07.839 --> 00:17:15.319
days they didn't work well. Memory
leaks are possible because I remember, yeah

207
00:17:15.440 --> 00:17:19.720
I recall living in the DBA land
at that time, and we were usually

208
00:17:19.759 --> 00:17:25.079
pretty hesitant to turn notification services on. So to have a dev come out

209
00:17:25.279 --> 00:17:26.559
and say, hey, we really
want to do this, can you can

210
00:17:26.559 --> 00:17:32.680
we have notification services like we would
push back, It's like that's another thing

211
00:17:32.720 --> 00:17:34.640
we need to monitor. It's a
bit cranky so we're going to need some

212
00:17:34.680 --> 00:17:38.240
restart mechanisms like all of that kind. I remember in the old days,

213
00:17:38.400 --> 00:17:42.440
and I can't remember exactly when,
but it was probably before two thousand and

214
00:17:42.480 --> 00:17:48.000
six that we used to do triggers. Fernando Guerrero taught me how to do

215
00:17:48.039 --> 00:17:57.960
this, to write a trigger on
insert that could notify your code somehow.

216
00:17:59.039 --> 00:18:00.920
And I can't it's been so long, I can't remember, but I remember

217
00:18:02.160 --> 00:18:07.640
actually showing this in a in a
webinar, because as of SQL Server two

218
00:18:07.680 --> 00:18:11.079
thousand and five, you could make
a dot net call out of a store

219
00:18:11.119 --> 00:18:14.279
procedure. Yeah, that's right,
So you could have embedded in that on

220
00:18:14.880 --> 00:18:19.000
insert trigger on an external call like
at gRPC or something like that. You're

221
00:18:19.039 --> 00:18:22.680
you're interesting, fifteen years too early
for GRP. No, but now you

222
00:18:22.720 --> 00:18:26.799
could, right. I mean they
didn't take the runtime out of SQL service.

223
00:18:26.839 --> 00:18:29.319
No, No, it's still air. It's off by default, but

224
00:18:29.359 --> 00:18:33.039
it's always been off by default.
Yeah, people abuse it. You know,

225
00:18:33.839 --> 00:18:37.640
you don't want to put an external
call into an aggregate function. No,

226
00:18:37.880 --> 00:18:45.480
bad, that would be bad,
Serge. Were there any features that

227
00:18:45.519 --> 00:18:48.759
you added that came from your customers
or you know, people who are using

228
00:18:48.759 --> 00:18:52.720
it I'm sure there were, But
do you have any stories about that?

229
00:18:52.720 --> 00:18:57.400
That's a great question, because thank
you. The whole story of Ganphar is

230
00:18:57.680 --> 00:19:04.920
everything is mixed together. Customer greary
is my own thoughts. So it's I

231
00:19:04.960 --> 00:19:08.599
don't know how to say it in
English, so yeah, no, I

232
00:19:08.680 --> 00:19:15.119
will really with everybody's input, Yeah, yeah, yeah, yeah, everybody

233
00:19:15.240 --> 00:19:18.759
was. I was involved. I've
tried hard to understand customers, to understand

234
00:19:19.039 --> 00:19:26.039
developers, and implement things as simple
as it possible, because because you know,

235
00:19:26.359 --> 00:19:33.680
no one wants to spend time supporting
difficult things. And what about crazy

236
00:19:33.720 --> 00:19:37.559
ideas? Does anybody come up to
you like a crazy idea that after about

237
00:19:37.960 --> 00:19:42.839
minute thought you just said, no, what you talk? What's that stupid

238
00:19:42.839 --> 00:19:49.759
idea? I think the most craziest
idea was my decision to add support of

239
00:19:49.880 --> 00:19:57.480
both no Skill and Relational Skill databases
in the early days. And no one

240
00:19:57.640 --> 00:20:11.960
told me don't do this. Trial
by hang fire. Yeah, because it's

241
00:20:11.160 --> 00:20:18.279
really difficult to mix so different things
in one a BI and to make them

242
00:20:18.359 --> 00:20:26.359
work. Because even now, when
I'm trying to document storage API, every

243
00:20:26.400 --> 00:20:34.480
time, I understand I can do
this right now because there there are so

244
00:20:34.559 --> 00:20:41.960
many words missing, and there are
a lot of concepts missing when you need

245
00:20:41.000 --> 00:20:48.640
to make friendship between locks, transactions
and other things. Yeah, are you

246
00:20:48.799 --> 00:20:52.079
using on the back end you go
all the way down the threads or are

247
00:20:52.119 --> 00:20:57.119
you trying to stick the tasks in
a task parallel library in a sink away.

248
00:20:57.279 --> 00:21:03.200
That's that's another great question. Thanks. That's what I do, by

249
00:21:03.240 --> 00:21:10.200
the way, And I started by
using threads. Then I switched to tasks,

250
00:21:10.359 --> 00:21:17.000
but on running task that are threats
under the surface. But then I

251
00:21:17.200 --> 00:21:26.279
even tried hard to build a synchronous
API as synchronous processes asynchronous not a synchronous

252
00:21:26.400 --> 00:21:33.000
process us. Yeah. Yeah,
I'm still learning. I was learning.

253
00:21:33.440 --> 00:21:45.039
I was learning English by writing documentation
to him fire awesome. So I'm still

254
00:21:45.119 --> 00:21:49.440
trying. You know, you're doing
great. You're doing great. I'm thinking

255
00:21:49.559 --> 00:21:52.079
back with it. Stephen Taboo said, this is like, listen, there's

256
00:21:52.119 --> 00:21:56.839
only three people that really understand multi
threaded programming, and two of them are

257
00:21:56.960 --> 00:22:08.680
lying the other one. I used
to teach multi threaded programming as a concept,

258
00:22:10.480 --> 00:22:15.000
and what I did was I used
Gary Kasparov actually as an example.

259
00:22:15.400 --> 00:22:21.000
I said, Gary Kasparoff is playing
chess in the park with those big stone

260
00:22:21.119 --> 00:22:23.279
chess boards. You know, they
are arranged in a circle like Stonehenge,

261
00:22:23.720 --> 00:22:27.079
and he's got you know, twenty
people. He's playing twenty games at once.

262
00:22:27.160 --> 00:22:30.799
He plays, he makes a move, he goes to the next one.

263
00:22:30.880 --> 00:22:33.640
He makes a move, and he
goes to the next one. And

264
00:22:33.160 --> 00:22:37.160
so that's how he can play twenty
games at the same time, but just

265
00:22:37.240 --> 00:22:41.160
make one move at a time.
And that's kind of the idea of threads.

266
00:22:41.400 --> 00:22:45.839
You know, down in the operating
system that the OS gives attention to

267
00:22:45.000 --> 00:22:49.640
one thread at a time and makes
a certain number of moves, a certain

268
00:22:49.720 --> 00:22:53.400
number of registers or whatever, makes
a call, and then moves on to

269
00:22:53.480 --> 00:22:59.519
the next one. So it's kind
of fortuitous that, you know, Gary

270
00:22:59.559 --> 00:23:04.480
casper off Man, he's a multi
threaded man. Yeah, he's a multi

271
00:23:04.599 --> 00:23:11.119
threaded man, both inside and outside
his brain. Yeah, yeah, I

272
00:23:11.160 --> 00:23:14.599
think we should take a break for
just a moment. Yeah, let's do

273
00:23:14.720 --> 00:23:22.559
that. We'll be right back after
these important messages and we're back. You're

274
00:23:22.559 --> 00:23:26.720
listening to dot net Rocks. I'm
Carl Franklin, and we're talking with Sergei

275
00:23:26.839 --> 00:23:32.440
Odie Knockoff about hang fire. We
were just talking about whether or not you

276
00:23:32.519 --> 00:23:36.559
know, you started with threads then
you went to tasks that use threads on

277
00:23:36.680 --> 00:23:40.720
the back end, and tasks men
all the way. That's what I say.

278
00:23:41.359 --> 00:23:44.319
Yeah, life is better that way. I hope I never have to

279
00:23:44.400 --> 00:23:51.519
use threads. How about locking mechanisms? Do you just use basic lock objects

280
00:23:51.599 --> 00:23:55.160
or do use semaphores? Or how
you know? What's your what's your?

281
00:23:56.119 --> 00:24:02.680
Do your locking mechanism? We can't
use a regular our logs or semaphos because

282
00:24:03.720 --> 00:24:07.559
they work only inside the same process, right, Yeah, you're right,

283
00:24:07.559 --> 00:24:15.000
and in far since we can move
process into another machine to use something else.

284
00:24:15.799 --> 00:24:22.359
There is an abstraction in storage API
called distributed lock. This was one

285
00:24:22.440 --> 00:24:27.400
of the most difficult points to make
them work and to make them work realiably

286
00:24:27.960 --> 00:24:33.759
because when talking about hand fire,
we can expect unexpected shut down in every

287
00:24:33.880 --> 00:24:40.799
line. So not only distributed locks
should work well, but the whole storage

288
00:24:41.240 --> 00:24:48.319
should work well, because we shouldn't
leave abandoned logs because they should be eventually

289
00:24:48.720 --> 00:24:55.799
released, and we should somehow mix
them with transactions to make out right to

290
00:24:56.559 --> 00:25:00.880
succeed. And hand fire is prepared
for expect to shut down every line,

291
00:25:02.559 --> 00:25:07.559
and it is really difficult to program
with this in mind. It looks like

292
00:25:07.759 --> 00:25:11.799
reddis supports, or you could do
distributed locks in reddist and maybe even something

293
00:25:11.839 --> 00:25:17.839
called zoo keeper. Have you looked
at that? Zoo Keeper sounds complicated.

294
00:25:19.599 --> 00:25:23.960
This whole thing sounds complicated. Yeah, yeah, yeah, yeah, that's

295
00:25:25.000 --> 00:25:33.400
why I'm trying to understand why it's
so complicated. It's ready in near bio,

296
00:25:33.119 --> 00:25:42.720
so infant far Distributed logs are tied
with transactions because radis supports transactions in

297
00:25:42.799 --> 00:25:52.200
a slightly different way than a relational
databases, but they work anyway. So

298
00:25:52.799 --> 00:25:59.960
I read that you have a retry
circuit breaker, number of retry attemps,

299
00:26:00.119 --> 00:26:03.640
you can customize your retry strategy,
and then I wondered, hey, is

300
00:26:03.720 --> 00:26:10.319
he using polly and I didn't see
that you are, So you're doing your

301
00:26:10.359 --> 00:26:15.519
own retri logic. I tried not
to introduce a lot of dependencies into hand

302
00:26:15.599 --> 00:26:22.400
fire because dependency eventually carted. Dependency
help. Yeah, it is in the

303
00:26:22.480 --> 00:26:30.039
dot net framework. You can create
an HDDP client factory with strategies or policies

304
00:26:30.119 --> 00:26:33.279
built in for retry. Is that
what you're using? No, No,

305
00:26:33.359 --> 00:26:37.279
you're doing your own. They're not
so complicated or so. Yeah, but

306
00:26:37.400 --> 00:26:45.200
you do allow the developer to specify
and customize the retry strategy if it doesn't.

307
00:26:45.400 --> 00:26:52.880
Yes, yea to some extent,
because it depends on complexity, on

308
00:26:53.039 --> 00:26:57.680
the number of fissures tries in hand. Fire not required to be difficult,

309
00:26:59.079 --> 00:27:03.519
not required to be complicated. So
they just work. Yeah, I JW

310
00:27:03.759 --> 00:27:14.359
technology, It just works. It
works. I think we invented a new

311
00:27:14.480 --> 00:27:25.039
slogan and fire good. I noticed
in the pricing model and it includes licensing

312
00:27:26.160 --> 00:27:32.960
that the open versions are LGPL three
licenses. Can you talk about that choice?

313
00:27:33.400 --> 00:27:37.440
Obviously this is probably decision you made
ten years ago. Yes. First

314
00:27:37.440 --> 00:27:42.079
of all, it was based on
Sidekick, right, I asked Mike Perhams

315
00:27:44.200 --> 00:27:49.640
my copy some things you told Yes. So there are a lot of things

316
00:27:51.079 --> 00:27:56.240
when you start your project. You
want to concentrate on features, on first

317
00:27:56.319 --> 00:28:00.400
implementations, and there are a lot
of everything else in your project, like

318
00:28:02.480 --> 00:28:08.680
licensing, like side like some kind
of marketing when you introduce your project,

319
00:28:10.200 --> 00:28:15.000
and you can do all the things
together so you can copy least important things

320
00:28:15.200 --> 00:28:22.880
and concentrate on more important things for
you. The same story was with lesser

321
00:28:22.000 --> 00:28:30.799
GPL license. Some people who are
asking to move to mt license on the

322
00:28:30.920 --> 00:28:37.799
course of years, but don't know
how to say this, I mean licensing

323
00:28:38.119 --> 00:28:42.839
works and I'm afraid of touching.
Yeah. No, changing a license is

324
00:28:44.119 --> 00:28:49.000
very challenging. Yes, yes,
because it can lead to a lot of

325
00:28:49.160 --> 00:28:56.799
consequences you can predict and lesser.
GPL works well for even for commercial use.

326
00:28:57.039 --> 00:29:06.440
It can people sometimes confuse it with
a GP license and and scared that

327
00:29:07.200 --> 00:29:12.599
they will need to open sources of
their own applications. Well, and that's

328
00:29:12.680 --> 00:29:18.599
the perception of all GPR licenses,
just not understanding that LGPL isn't like that.

329
00:29:18.079 --> 00:29:22.920
So I didn't know that. I
just learned that just now I thought

330
00:29:22.960 --> 00:29:27.519
anything GPL meant. I if I
were to say, implement poly around you

331
00:29:27.599 --> 00:29:33.000
know, my retry policies, I
would have to then submit that back to

332
00:29:33.119 --> 00:29:41.200
the project. But it's difficult,
it's complicated. It's complicated. Yes,

333
00:29:41.200 --> 00:29:48.519
they allow commercial use and this phrase
is highlighted on the site. Absolutely,

334
00:29:48.240 --> 00:29:55.920
and LGPL is it exists for how
many years? A long time? More

335
00:29:56.000 --> 00:30:03.440
than twenty years? Yeah, yeah, so I think time. And actually

336
00:30:03.960 --> 00:30:10.440
there are a lot of sites that
describe the differences, yes, of each

337
00:30:10.599 --> 00:30:15.799
license nowadays. So sometimes I get
these questions, I answer, I answer

338
00:30:15.880 --> 00:30:22.000
them. People I can use it, so I can I wonder if you

339
00:30:22.079 --> 00:30:27.119
don't have developers who have a limited
amount of knowledge about over source licensing,

340
00:30:27.160 --> 00:30:30.680
but they've been told by their company
as long as it's MIT, it's fine,

341
00:30:32.359 --> 00:30:34.039
and that's all they know and so, and that's why they're pushing on

342
00:30:34.160 --> 00:30:37.240
you. It is like, could
I have MIT please, because my boss

343
00:30:37.279 --> 00:30:41.799
already told me that's okay. Yeah, these companies can buy a commercial license,

344
00:30:42.039 --> 00:30:45.000
and I thought that was so.
As soon as I saw this page,

345
00:30:45.519 --> 00:30:49.559
I thought this is brilliant. If
you're not willing to learn the rules

346
00:30:49.599 --> 00:30:53.240
of LGPL, you can pay to
make it go away. Yeah yeah,

347
00:30:53.559 --> 00:30:59.200
yeah, sure, so smart because
if you learn the rules, I mean

348
00:30:59.279 --> 00:31:02.880
all LGPR well and correct me if
I'm wrong. Here says is if you

349
00:31:03.039 --> 00:31:06.759
make improvements to this, if you
make changes to it, contribute them back.

350
00:31:07.279 --> 00:31:11.720
Yeah. Yeah. One of the
main points is LGBL license allows to

351
00:31:11.960 --> 00:31:18.640
avoid competitions with ourselves. Right,
Okay, when you have twenty fire like

352
00:31:18.759 --> 00:31:30.200
projects and you have to compute with
your own code, right, it's strench

353
00:31:30.359 --> 00:31:36.200
for me. Okay. Can we
talk about the batch idea that's in the

354
00:31:36.279 --> 00:31:41.440
pro version, and the provision is
the paid version obviously, but batches and

355
00:31:41.519 --> 00:31:47.480
batch continuations. I mean, anybody
who's figured out and listening by now could

356
00:31:47.480 --> 00:31:51.319
probably figure out what we're talking about
here. A batches a group of background

357
00:31:51.440 --> 00:31:56.839
jobs created automatically and considered as a
single entity, and then a batch continuation

358
00:31:56.240 --> 00:32:01.759
is fired when all the background jobs
and a parent batch finish. Is there

359
00:32:01.960 --> 00:32:07.720
also a way to know when each
job in the batch has finished? Is

360
00:32:07.799 --> 00:32:12.680
that just a regular continuation continue job
with In other words, can you do

361
00:32:12.759 --> 00:32:15.279
both of these together? If I
have a batch continuation that fires when all

362
00:32:15.359 --> 00:32:21.359
of them happen, can I also
know when individual jobs fire? You can

363
00:32:21.480 --> 00:32:25.279
even create nested batches and nest that. That's crazy, you know, mister,

364
00:32:25.599 --> 00:32:32.759
and and and nested batch continuation that
continue and other continuations. So yikes,

365
00:32:34.039 --> 00:32:39.839
it's possible to mix things and build
a really complex work close. When

366
00:32:39.880 --> 00:32:43.799
I hear you describe that, I'm
like, wow, it's your foot.

367
00:32:44.480 --> 00:32:47.920
You know what's scary out there?
Somewhere there's somebody listening, say hey,

368
00:32:49.039 --> 00:33:00.440
I could configure this with YAML.
In the early days of Fire development,

369
00:33:00.599 --> 00:33:07.680
I was talking a one developer who
advised me to use XML for configure and

370
00:33:07.799 --> 00:33:14.000
everything. But he was from Java
world, so I understand him. It's

371
00:33:15.720 --> 00:33:22.319
yeah, Jason, all the way. Yeah. Oh man, so no,

372
00:33:22.599 --> 00:33:25.759
thank you. Any piece of software
I've ever met that's run for ten

373
00:33:25.880 --> 00:33:30.559
years has changed thessigence decisions along the
way at some point that just that seems

374
00:33:30.599 --> 00:33:35.279
inevitable, the same way you started
in threads and then moved up to tasks,

375
00:33:36.359 --> 00:33:38.319
Like, there's got to be other
cases where you just find I have

376
00:33:38.440 --> 00:33:44.440
to change to do this. Well, now I'm trying to obstruct him far

377
00:33:44.599 --> 00:33:49.759
as much as possible, and the
foundations like threads are not going anywhere,

378
00:33:50.079 --> 00:33:53.720
so yeah, be something you can
count on. Even the netflatform itself changed

379
00:33:53.839 --> 00:34:00.599
a lot, but yeah, fire
looks the same, so yeah, your

380
00:34:00.680 --> 00:34:06.400
code's the same. What was there
any difficulty for you switching implementations or having

381
00:34:06.400 --> 00:34:09.880
implications for both the framework and for
core. The most difficult things was the

382
00:34:10.039 --> 00:34:20.079
early days of dot net core with
lack of development tools support because everything was

383
00:34:20.239 --> 00:34:28.559
changing. I mean, god coverage
tools called analysis tools and unit testing continuous.

384
00:34:30.519 --> 00:34:32.360
Well, I mean you were through
that era, coming right from twenty

385
00:34:32.440 --> 00:34:36.199
thirteen of the early days of dot
net core. Yeah, but even the

386
00:34:36.239 --> 00:34:39.000
early days of how you do CICD
pipelines like that's evolved a lot in the

387
00:34:39.079 --> 00:34:44.599
past ten years, but the concepts
are the same. Foundations are the same,

388
00:34:44.800 --> 00:34:49.760
so I think I think not so
much things changed added. A lot

389
00:34:49.840 --> 00:34:54.400
of things added, but not changed. Core concepts stay the same. Before

390
00:34:54.440 --> 00:35:00.480
we before we get off is can
you talk about job filters. That seems

391
00:35:00.519 --> 00:35:04.559
like a very powerful feature. Yeah, job builders, I think it's the

392
00:35:04.719 --> 00:35:10.400
most powerful feature from Fire. Every
extension, every paid package depends on them,

393
00:35:10.599 --> 00:35:15.679
and they allowed to extend can fire
so you can implement new things,

394
00:35:16.000 --> 00:35:23.519
more complex use cases, more integration
with application without modifying hand far and without

395
00:35:23.639 --> 00:35:32.519
rebuilding it or without using your own
version of FAR. Extensibility was one of

396
00:35:32.599 --> 00:35:39.360
the main points during the initial initial
development because it's not possible to build a

397
00:35:39.440 --> 00:35:45.880
solution that will suit everyone, and
you have to make some extension points that

398
00:35:45.000 --> 00:35:50.400
are powerful enough to make everyone happy. Yeah, very cool. So it's

399
00:35:50.440 --> 00:35:52.280
kind of like, and it says
this right here, they're kind of like

400
00:35:52.440 --> 00:35:58.320
they're similar to Aspen at NBC Action
Filters. Yes, I've tried to copy

401
00:35:58.440 --> 00:36:07.320
the concepts because their concept was already
from sp developers. Is there any flavor

402
00:36:07.360 --> 00:36:15.440
of dot net or implementation on a
particular system of dot net where certain features

403
00:36:15.559 --> 00:36:20.559
aren't available or the syntax is different
or is it just so easy that it

404
00:36:20.599 --> 00:36:23.639
works everywhere on every flavor of dot
net? Another good question. The most

405
00:36:23.679 --> 00:36:30.360
problematic one was the first version of
dot net core. Oh yeah, nobody

406
00:36:30.440 --> 00:36:34.960
uses that anymore. Yeah yeah,
yeah, but it's still supported by him

407
00:36:35.079 --> 00:36:49.519
fire. Both users really appreciate that. Okay, you're welcome if you listen,

408
00:36:49.800 --> 00:36:53.719
if you listen to us. Okay, but the net standard, a

409
00:36:53.800 --> 00:37:00.079
lot of features are resurrected. It's
a big kudos for the net developers because

410
00:37:00.639 --> 00:37:08.280
they did great job for making it
run and even feel the same on different

411
00:37:08.360 --> 00:37:15.000
platforms. In your list of features
to implement, is there anything so crazy

412
00:37:15.119 --> 00:37:20.400
that you feel like you're going to
have to take a week and go into

413
00:37:20.519 --> 00:37:24.039
a cabin and do a Ted Kazinski
somewhere and just you know, is there

414
00:37:24.079 --> 00:37:30.760
anything really on your you know,
on your implementation list that you're not looking

415
00:37:30.840 --> 00:37:36.920
forward to. I think it relates
again, different storage type support. It

416
00:37:37.679 --> 00:37:45.360
I dream implementing some kind of integration
testing for that will work for different storages,

417
00:37:45.599 --> 00:37:51.039
so you don't have to write dedicated
test suits for new storages, so

418
00:37:51.199 --> 00:37:58.280
you can just use it to test
even new storages. Some kind of acceptance

419
00:37:58.639 --> 00:38:02.480
tests. Yeah, have you ever
considered taking the database out of the picture,

420
00:38:02.599 --> 00:38:07.920
except for maybe something to persist on
the server, but you know,

421
00:38:07.079 --> 00:38:12.639
using a communication network like g r
p C or something to go directly to

422
00:38:12.760 --> 00:38:16.320
the server thing, and then the
server can just like keep a keep a

423
00:38:16.440 --> 00:38:22.840
local cache of that in case you
know, it has to reset or reboot

424
00:38:22.920 --> 00:38:30.760
or something. Moreover, there are
interesting projects available on GitHub like rocks dB.

425
00:38:30.159 --> 00:38:37.159
How do you spell that, rocks
dB, Rocks database, Rocks database,

426
00:38:37.800 --> 00:38:42.480
Rocks, rocks r O c k
S. Yeah, yeah, like

427
00:38:43.239 --> 00:38:51.960
rocks but rocks I see rocks D. Caveman used to use these for for

428
00:38:52.199 --> 00:38:57.320
keeping track of things. It's it's
an embedable database. You can add it

429
00:38:57.639 --> 00:39:05.119
to your own application. So you
can indeed build a gRPC protocol and use

430
00:39:05.239 --> 00:39:12.360
it in another high performance Okay,
so in that case you would have you'd

431
00:39:12.400 --> 00:39:19.880
have to write an abstraction over the
client and instead of hooking directly into the

432
00:39:20.000 --> 00:39:24.199
server process or whatever it is,
the server, you would put a little

433
00:39:24.199 --> 00:39:30.119
messaging between that and then you would
run the client and server, you know,

434
00:39:30.280 --> 00:39:36.000
logical server together wherever you're implementing that, I kind of get it.

435
00:39:37.079 --> 00:39:40.760
Yeah, So at the bottom line
here is it's wicked extensible. I mean,

436
00:39:40.800 --> 00:39:45.079
you've got the source for crying out
loud. You're a programmer, figure

437
00:39:45.119 --> 00:39:52.800
it out. Not you, sir, I'm talking about the listener for using

438
00:39:52.920 --> 00:39:57.760
hang fire. You're a developer.
That's what they pay you for. Okay,

439
00:39:57.800 --> 00:40:07.559
Okay, thirty years and I implement
everything but no support regress for thirty

440
00:40:07.679 --> 00:40:13.639
years and everything will be done.
So what's next for you? What are

441
00:40:13.679 --> 00:40:15.840
you going to be doing right after
you get off this call besides going to

442
00:40:15.920 --> 00:40:25.639
bed. We're going to hear tomorrow
because one of the most difficult things for

443
00:40:25.800 --> 00:40:32.159
today was to make my children sleep. Uh huh yeah, I succeeded ten

444
00:40:32.280 --> 00:40:38.800
minutes before our show. Oh great, well, well done. Yeah,

445
00:40:38.960 --> 00:40:44.960
how do you get two and five? Yes? Okay, chaos monkeys,

446
00:40:45.119 --> 00:40:50.440
chaos monkeys? Yeah, all right, Well, enjoy the wonderful foods and

447
00:40:50.639 --> 00:40:54.119
smells of Thailand and we wish you
success with hang fire, and thanks for

448
00:40:54.199 --> 00:41:00.639
talking to us. Thank you for
the invitation and for the talk speaker.

449
00:41:00.800 --> 00:41:05.719
You good questions, great, thanks, thank you, and we'll talk to

450
00:41:05.800 --> 00:41:30.159
you next time on dot net rocks. Dot net Rocks is brought to you

451
00:41:30.280 --> 00:41:35.559
by Franklin's Net and produced by Pop
Studios, a full service audio, video

452
00:41:35.679 --> 00:41:39.559
and post production facility located physically in
New London, Connecticut, and of course

453
00:41:39.639 --> 00:41:45.239
in the cloud online at pwop dot
com. Visit our website at d O

454
00:41:45.400 --> 00:41:50.400
T N E T R O c
k S dot com for RSS feeds,

455
00:41:50.719 --> 00:41:54.199
downloads, mobile apps, comments,
and access to the full archives, going

456
00:41:54.239 --> 00:41:59.559
back to show number one, recorded
in September two thousand and two. It

457
00:41:59.639 --> 00:42:02.400
makes you check out our sponsors.
They keep us in business. Now go

458
00:42:02.519 --> 00:42:07.800
write some code. See you next
time. You got tad middle vans down

459
00:42:14.280 --> 00:42:15.239
home. Then

